我有一张桌子Tb1
ID1 - ID2 - other columns.... 12 - 25 - xxxx 24 - 63 - xxx .....
和Tb2
ID1 - ID2 - other columns.... 12 - 25 - xxxx 34 - 65 - xxx .....
现在我想基于2个ID列加入这两个表。
Select * from tb1
Join tb2
on tb1.ID1=tb2.ID1 and tb1.ID2=tb2.ID2
我的任务是,这样做是否正常,如果我按照这种方式设计数据库有什么问题吗?出于某种原因,我不能制作1个ID列。
加入如何工作? 1号加入ID1&然后它使用结果加入ID2?
答案 0 :(得分:3)
有时,您可能确实需要两个ID列来标识特定行(当然,这取决于数据)。 如果确实如此,我认为在多个表中具有相同的两个标识符并根据它们加入是没有问题的。
答案 1 :(得分:2)
您所描述的内容是完全可以接受的,并且经常出现在与junction tables中的many:many
关系的联接中。
如果需要另一个表引用many:many
表中的行,则会出现您描述的场景(需要在2个公共列上连接2个表)。
考虑以下设计的示例,其中联结表PersonPhoto
- {一个人可以拥有许多照片,照片可以是许多人} - 需要由审计表引用。可以看出,PersonId
和PhotoId
都需要保留在引用表中,以识别为审计目的而修改了哪一行:
因此,只要表PersonPhoto
和PersonPhotoAudit
之间需要加入,就需要在两个表中加入PhotoId
和PersonId
列。
DDL的SqlFiddle:MySql here和SqlServer here
如果PhotoId
上的PersonId
和PersonPhoto
组合是唯一的,则该对可以转换为compound (or composite)主键。此复合键的外键需要包含两列。
备选方案(两个表中都有两个键列)是在联结表上创建一个新的代理主键(例如PersonPhotoID INT NOT NULL, PRIMARY KEY (PersonPhotoID)
)。然后,在引用像PersonPhotoAudit
)这样的表时,只需要引用这个代理键。