假设我有一只餐桌狗
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查询。
发布于 2017-03-14 19:23:10
你拥有的是一段多到多的关系。
这是关系数据库设计中常见的问题。多到多关系所需要的是定义另一个表。
+----------+----------+
| 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查询
我不明白这有什么关系。数据组织是关于第三范式的,而不是关于如何查询数据的。
唯一的选择是将多个所有者ids存储在一行的一列中,这不是关系数据库的有效设计。见我对在数据库列中存储分隔列表真的有那么糟糕吗?的回答
发布于 2017-03-14 19:04:13
创建另一个表所有者,并向表狗提供外键。
https://stackoverflow.com/questions/42794387
复制相似问题