如何在关系数据库(特定情况)中共享资源?

时间:2017-03-14 18:59:27

标签: mysql database database-design relational-database

说我有一张桌子狗

mysql> select * from dogs;
+----------+-------------+----------+
| dog_id   | tail_length | owner_id |
+----------+-------------+----------+
| dog-id-1 | 1 cm        | owner-1  |
| dog-id-2 | 2 cm        | owner-2  |
| dog-id-3 | 3 cm        | owner-3  |
+----------+-------------+----------+

其中 dog_id 是主键, owner_id 是唯一的。 现在我希望分享狗是可能的。所以表可以。

    +----------+-------------+----------+
    | dog_id   | tail_length | owner_id |
    +----------+-------------+----------+
    | dog-id-1 | 1 cm        | owner-1  |
    | dog-id-2 | 2 cm        | owner-2  |
    | dog-id-3 | 3 cm        | owner-3  |
    | dog-id-3 | 3 cm        | owner-1  |
    | dog-id-3 | 3 cm        | owner-1  |
    +----------+-------------+----------+

但由于 dog_id 是主键而 owner_id 在表中是唯一的,因此无法实现。狗可以与10000多名用户共享。

由于向后兼容性的限制,我无法删除原始表的主要和唯一键约束,我必须使用mysql来执行此操作。什么是实现分享的最佳策略?

附加约束:我只能通过dog_id而不是owner_id进行查询。

2 个答案:

答案 0 :(得分:1)

你所拥有的是多对多的关系。

  • 一只狗可以有很多主人
  • 个人所有者可以拥有许多狗

这是关系数据库设计中的常见问题。多对多关系需要的是定义另一个表。

+----------+----------+
| dog_id   | owner_id |
+----------+----------+
| dog-id-1 | owner-1  |
| dog-id-2 | owner-2  |
| dog-id-3 | owner-3  |
| dog-id-3 | owner-1  |
| dog-id-3 | owner-1  |
+----------+----------+
  

我只能通过dog_id查询而不能查询owner_id

我不明白为什么这是相关的。数据组织大约是Third Normal Form,而不是您将如何查询数据。

唯一的替代方法是将多个所有者ID存储在一行的一列中,这不是关系数据库的有效设计。请参阅我对Is storing a delimited list in a database column really that bad?

的回答

答案 1 :(得分:0)

创建另一个表所有者并向表Dogs提供外键。