ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

mysql – 同一两个表上的多对一和一对一关系?

2019-06-21 10:03:25  阅读:247  来源: 互联网

标签:mysql database-design data-modeling


我正在设计一个数据库,其中两个字段具有多对一的关系,但我也需要它们之间的一对一关系,我想知道是否有更好的方法来实现它比我现在好了.

我的表是帐户和用户.一个帐户可以有多个用户,但每个帐户只能且必须拥有一个所有者.用户只能与一个帐户相关联.

我在users表中有一个帐户字段,用于存储用户所关联帐户的ID.在帐户表中,我有一个所有者字段,它存储拥有该帐户的用户的ID(即主管理员).

我正在使用InnoDB,所以我可以使用外键.问题是我不能创建一个帐户或用户没有先创建另一个(由于外键的限制),所以我让所有者可以为空.现在我可以使用null所有者创建一个帐户,然后创建用户,最后将该帐户的所有者设置为该用户.

这是否可以接受,是否有更好的方法?

以下是我提出的一些可能的其他方式,以及我对每个方面的看法:

>在users表中有一个布尔所有者字段.由于每个帐户只能拥有一个所有者,因此这种方式似乎不太理想,因为我必须确保每个帐户只有一个用户将该属性设置为true.
>有一个名为所有者的第三个表.这似乎是更多的开销和更多的工作,没有充分的理由,因为它实际上与在users表中拥有所有者字段相同.

我现在如何拥有它对我来说最有意义,但是在我创建用户之前设置一个null所有者有点尴尬,然后在事后回来设置它.

我很感激你能给我的任何意见.谢谢!

这个问题很相似,但没有提到外键:Designing Tables: One to many and one to one at same time?

解决方法:

一般来说,如果你的模式不能在拓扑上进行排序,那就是一个坏主意,即如果你不能建立一个排序,其中一个表只引用排序中它前面的表.这种“分层”依赖关系也是一个非常好的属性,例如对于软件模块(如果两个模块相互依赖,则会出现问题).

在您的情况下,您的用户引用了引用用户的帐户和帐户,因此很明显无法找到拓扑排序.

在这种情况下,一个标准解决方案是引入一个单独的表格“角色”,其中有三列:用户,帐户和角色.列角色可以是“所有者”或“访客”.

您知道(根据当前请求)帐户必须拥有一个且只有一个所有者,或者用户必须列在一个且仅一个帐户中的事实不是与“用户”域真正相关的IMO规则和“帐户”.

您可以轻松实现这些规则,但构建数据以便您没有其他可能性是IMO的错误.你的目标应该是建立域名,而不是具体的规则…因为人们会改变他们对这些规则的看法.

你能想象一个有两个帐户的用户吗?你能想到一个拥有多个所有者/管理员的帐户吗?我可以……这意味着很可能很快这将是一个请求.构建数据以便您无法代表这一点正在寻找麻烦.

此外,当您在模型中具有循环依赖性时,您的查询将更难编写.

一个非常常见的情况是例如尝试使用一个表来表示一个分层部件列表数据库,其中“父”字段指向表本身…更好的是有两个表,部分和组件,其中组件具有两个引用部分和数量.

标签:mysql,database-design,data-modeling
来源: https://codeday.me/bug/20190621/1253973.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有