首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在关系数据库中共享资源(具体情况)?

如何在关系数据库中共享资源(具体情况)?
EN

Stack Overflow用户
提问于 2017-03-14 18:59:27
回答 2查看 59关注 0票数 1

假设我有一只餐桌狗

代码语言:javascript
复制
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是唯一的。现在我希望有可能分享狗。这样桌子就可以了。

代码语言:javascript
复制
    +----------+-------------+----------+
    | 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查询。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-14 19:23:10

你拥有的是一段多到多的关系。

  • 狗可以有很多主人
  • 一个个体主人可以拥有许多狗。

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

代码语言:javascript
复制
+----------+----------+
| 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存储在一行的一列中,这不是关系数据库的有效设计。见我对在数据库列中存储分隔列表真的有那么糟糕吗?的回答

票数 1
EN

Stack Overflow用户

发布于 2017-03-14 19:04:13

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42794387

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档