我正在开发一个需要代表计算机及其用户的数据库.每台计算机可以有多个用户,每个用户可以与多台计算机相关联,因此这是一种典型的多对多关系.但是,还需要一个"主要"用户的概念.我必须能够加入主用户才能列出所有主要用户的计算机.我不确定数据库中最好的结构方式是什么:
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) }
这为您提供了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