Nei*_*ams 6 sql-server database-design
我正在开发一个需要代表计算机及其用户的数据库.每台计算机可以有多个用户,每个用户可以与多台计算机相关联,因此这是一种典型的多对多关系.但是,还需要一个"主要"用户的概念.我必须能够加入主用户才能列出所有主要用户的计算机.我不确定数据库中最好的结构方式是什么:
1)正如我现在所做的那样:将表与布尔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)
}
Run Code Online (Sandbox Code Playgroud)
这为您提供了0或1个主要用户(如果需要,PrimaryUserId可以为空),它必须位于Computer_User中.编辑:如果用户只能是1台计算机的主要用户,则Computer.PrimaryUserId上的UNIQUE CONSTRAINT将强制执行该操作.请注意,并不要求所有用户都是某台计算机上的主用户(这将是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
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
304 次 |
最近记录: |