说我有一张桌子狗
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进行查询。
答案 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提供外键。