gpt4 book ai didi

sql-server - 多对多 "Primary"

转载 作者:行者123 更新时间:2023-12-02 19:00:41 25 4
gpt4 key购买 nike

我正在开发一个需要代表计算机及其用户的数据库。每台计算机可以有多个用户,每个用户可以与多台计算机关联,因此这是一种经典的多对多关系。然而,还需要有一个“主要”用户的概念。我必须能够加入主要用户以列出所有计算机及其主要用户。我不确定在数据库中构建此结构的最佳方法是什么:

1)正如我目前正在做的:将表与 bool IsPrimary 列链接。加入需要类似 ON (c.computer_id = l.computer_id AND l.is_primary = 1) 的内容。它有效,但感觉不对,因为将数据限制为每台计算机只有一个主要用户并不容易。

2) 计算机表上的一个字段,直接指向用户行,用户表中的所有行代表非主用户。这更好地代表了每台计算机一个主的约束,但使获取计算机用户列表变得更加困难。

3) 计算机表上的字段链接到链接表中的行。感觉很奇怪...

4)还有别的吗?

描述这种关系的“关系”方式是什么?

编辑:@Mark Brackett:第三个选项对我来说似乎不那么奇怪了,因为你已经展示了它看起来有多漂亮。由于某种原因,我什至没有想到使用复合外键,所以我想我必须在链接表上添加一个标识列才能使其工作。看起来很棒,谢谢!

@j04t:酷,我很高兴我们现在就#3 达成一致。

最佳答案

选项 3 虽然可能感觉很奇怪,但它最接近您想要建模的内容。你会做类似的事情:

User { 
UserId
PRIMARY KEY (UserId)
}

Computer {
ComputerId, PrimaryUserId
PRIMARY KEY (UserId)
FOREIGN KEY (ComputerId, PrimaryUserId)
REFERENCES Computer_User (ComputerId, UserId)
}

Computer_User {
ComputerId, UserId
PRIMARY KEY (ComputerId, UserId)
FOREIGN KEY (ComputerId)
REFERENCES Computer (ComputerId)
FOREIGN KEY (UserId)
REFERENCES User (UserId)
}

这将为您提供 0 或 1 个主用户(如果需要,PrimaryUserId 可以为空),该用户必须位于 Computer_User 中。编辑:如果一个用户只能是一台计算机的主要用户,则 Computer.PrimaryUserId 上的唯一约束将强制执行该操作。请注意,不要求所有用户都是某台计算机上的主要用户(这将是 1:1 关系,并且要求他们位于同一个表中)。

编辑:一些查询向您展示此设计的简单性

--All users of a computer
SELECT User.*
FROM User
JOIN Computer_User ON
User.UserId = Computer_User.UserId
WHERE
Computer_User.ComputerId = @computerId

--Primary user of a computer
SELECT User.*
FROM User
JOIN Computer ON
User.UserId = Computer.PrimaryUserId
WHERE
Computer.ComputerId = @computerId

--All computers a user has access to
SELECT Computer.*
FROM Computer
JOIN Computer_User ON
Computer.ComputerId = Computer_User.ComputerId
WHERE
Computer_User.UserId = @userId

--Primary computer for a user
SELECT Computer.*
FROM Computer
WHERE
PrimaryUserId = @userId

关于sql-server - 多对多 "Primary",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/160051/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com