当前位置:  开发笔记 > 编程语言 > 正文

多对多与"小学"

如何解决《多对多与"小学"》经验,为你挑选了1个好方法。

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

1)正如我现在所做的那样:将表与布尔IsPrimary列链接起来.加入需要像ON一样(c.c​​omputer_id = l.computer_id AND l.is_primary = 1).它有效,但感觉不对,因为将数据限制为每台计算机只有一个主要用户并不容易.

2)计算机表上直接指向用户行的字段,用户表中的所有行表示非主要用户.这代表了每个计算机的一次主要约束,但却使计算机用户列表变得更难.

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

4)还有别的吗?

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

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

@ j04t:很酷,我很高兴我们现在同意#3.



1> Mark Bracket..:

选项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

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有