在MySQL中建模所有权

时间:2015-07-29 11:27:52

标签: mysql

我有一个表Things,我想将所有权关系添加到表Users。我需要能够快速查询事物的所有者和用户拥有的东西。如果我知道最多将有50个所有者,并且所有者数量的pdf可能看起来像this,我应该

  • Things表添加50列,例如CoOwner1IdCoOwner2Id,...,CoOwner50Id
  • 我应该使用包含OwnershipsUserId列的ThingId表格对此进行建模,或者
  • 最好为每件事创建一个表,例如Thing8321Owners,每个所有者都有一行,或者
  • 也许是这些的组合?

2 个答案:

答案 0 :(得分:1)

第二种选择是正确的;您应该在表格和表格所有者(包含每个所有者的详细信息)之间创建一个中间表 该表应该具有thing_id和owner_id作为主键。 最后,你有3个表:

  • 事物(事物细节和数据)
  • 所有者(所有者详细信息和数据)
  • 所有权(将每个thing_id分配给owner_id)

因为在关系数据库中,您不应该有任何冗余数据。

答案 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

比其他任何场景都容易得多吗?