MySQL中的所有权建模

MySQL中的所有权建模,mysql,Mysql,我有一个表Things,我想向表Users添加所有权关系。我需要能够快速查询物品的所有者和用户拥有的物品。如果我知道最多会有50名业主,而业主人数的pdf格式可能会是这样的,我应该这样做吗 在Things表中添加50列,如CoOwner1Id,CoOwner2Id,…,CoOwner50Id,或 我是否应该使用一个包含UserId和ThingId列的Ownerships表对此进行建模,或者 是否最好为每件事创建一个表,例如Thing8321Owners,为每个所有者创建一行,或者 也许是这些的

我有一个表
Things
,我想向表
Users
添加所有权关系。我需要能够快速查询物品的所有者和用户拥有的物品。如果我知道最多会有50名业主,而业主人数的pdf格式可能会是这样的,我应该这样做吗

  • Things
    表中添加50列,如
    CoOwner1Id
    CoOwner2Id
    ,…,
    CoOwner50Id
    ,或
  • 我是否应该使用一个包含
    UserId
    ThingId
    列的
    Ownerships
    表对此进行建模,或者
  • 是否最好为每件事创建一个表,例如
    Thing8321Owners
    ,为每个所有者创建一行,或者
  • 也许是这些的结合

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

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

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

    您肯定应该使用选项2,因为您试图建模的是一个数据库。(许多所有者可以与一件事物联系起来。许多事物可以与所有者联系起来。)这通常是通过使用我称之为。(这正是选项2)它是规范化数据库中的标准技术

    另外两个选项会让你梦魇般地试图查询或维护

    使用选项1,您需要将
    User
    表连接到50列上的
    Thing
    表,以获得所有结果。当你有51个人想要拥有的真正受欢迎的东西时会发生什么

    选项3甚至更糟。轻松查询数据的唯一方法是使用动态sql或每次编写一个新查询,因为在知道要查找的对象的ID值之前,您不知道要加入哪个
    Thing*owner
    表。或者您需要将
    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
    

    比任何其他场景都简单?

    选项2。总是。每当你有别的想法时,打自己一巴掌。受自己的手比受别人的手好。严格遵循NB的建议……顺便说一句,上面有三个例子说明你有别的想法。