我有一个表Things
,我想将所有权关系添加到表Users
。我需要能够快速查询事物的所有者和用户拥有的东西。如果我知道最多将有50个所有者,并且所有者数量的pdf可能看起来像this,我应该
Things
表添加50列,例如CoOwner1Id
,CoOwner2Id
,...,CoOwner50Id
或Ownerships
和UserId
列的ThingId
表格对此进行建模,或者Thing8321Owners
,每个所有者都有一行,或者答案 0 :(得分:1)
第二种选择是正确的;您应该在表格和表格所有者(包含每个所有者的详细信息)之间创建一个中间表 该表应该具有thing_id和owner_id作为主键。 最后,你有3个表:
因为在关系数据库中,您不应该有任何冗余数据。
答案 1 :(得分:1)
你绝对应该使用选项2,因为你想要建模的是many to many relationship。 (许多所有者可能与某事物有关。很多事情都与所有者有关。)这通常使用我称之为bridging table的方式来完成。 (这与选项2完全相同。)它是标准化数据库中的标准技术。
另外两个选项会让你做噩梦尝试查询或维护。
使用选项1,您需要将User
表加入 50 列的Thing
表格,以获得所有结果。当你有一个51人想要拥有的非常受欢迎的东西时会发生什么?
选项3更糟糕。轻松查询数据的唯一方法是每次都使用动态sql或编写新查询,因为在知道事物的ID值之前,您不知道要加入哪个Thing*Owners
表。 ;寻找。或者您需要将User
表加入每个Thing*Owners
表。添加新东西意味着创建一个全新的表。但至少有一件事对它可能拥有的所有者数量没有限制。
现在不是这样的:
SELECT Users.Name, Things.Name
FROM Users
INNER JOIN Ownership ON Users.UserId=Ownership.UserId
INNER JOIN Things ON Things.ThingId=Ownership.ThingId
比其他任何场景都容易得多吗?