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