mysql - 同一张表上的多对一和一对一关系?

标签 mysql database-design data-modeling

我正在设计一个数据库,其中两个字段具有多对一关系,但我还需要它们之间存在一对一关系,我想请教一下是否有更好的方法比我现在得到的还要多。

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

我在 users 表中有一个 account 字段,它存储与用户相关的帐户的 ID。在 accounts 表中,我有一个 owner 字段,它存储拥有该帐户的用户的 ID(即主管管理员)。

我正在使用 InnoDB,因此我可以使用外键。问题是,如果没有先创建另一个帐户或用户(由于外键的限制),我无法创建帐户或用户,因此我将 owner 设置为可为空。现在我可以创建一个具有空 owner 的帐户,然后创建用户,最后将帐户上的 owner 设置为用户。

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

以下是我想到的其他一些可能的方法,以及我对每种方法的看法:

  1. users 表中有一个 bool 值 owner 字段。由于每个帐户只能有一个所有者,这种方式似乎不太理想,因为我必须确保每个帐户只有一个用户将属性设置为 true

  2. 有一个名为 owners 的第三个表。这似乎是无缘无故的更多开销和更多工作,因为它实际上与 users 表中的 owner 字段相同。

我现在拥有它的方式对我来说最有意义,但是在我创建用户之前必须设置一个空所有者,然后在事后回来设置它有点尴尬。

如果您能给我任何意见,我将不胜感激。谢谢!

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

最佳答案

如果您的架构无法按拓扑排序,即如果您无法建立一个表仅引用排序中它前面的表的排序,则通常是一个坏主意。这种“分层”依赖性也是一个非常好的属性,例如对于软件模块(如果两个模块相互依赖,就会出现问题)。

在您的情况下,您有指向帐户的用户和指向用户的帐户,所以显然无法找到拓扑排序。

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

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

您可以轻松地实现这些规则,但在我看来,将数据结构化以使您没有其他可能性是错误的。您的目标应该是为领域建模,而不是特定规则...因为人们会改变他们对这些规则是什么的看法。

您能设想一个拥有两个帐户的用户吗?您可以设想一个拥有多个所有者/管理员的帐户吗?我可以...这意味着很可能很快就会提出请求。构建数据以使其无法表示这是在自找麻烦。

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

例如,一个非常常见的情况是尝试仅使用一个表来表示分层零件列表数据库,该表的“父”字段指向表本身......有两个更好取而代之的是零件和组件表,其中组件有两个对零件和数量的引用。

关于mysql - 同一张表上的多对一和一对一关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6681989/

相关文章:

mysql - 合并 MySQL 中的两个 WordPress 用户表

mysql - 在另一个多对多表中引用多对多表中的行是个坏主意吗

为用户设计的SQL表,可以给用户留下反馈

java - 将继承类型之间的关系建模为 ORM

php - 变量不从 PHP 中的数据库更新

mysql - 在 MySQL 中自定义主键

mysql过滤器在其他列匹配的地方重复

sql-server - SQL Server 2000 与 2005+ 示例数据库来研究数据库设计?

java - 在 Hybris 电子商务上创建产品数据模型

sql - 我如何正确地为基于 SQL 的数据库中的数据建模,这些数据库有一些共同的列,但也有一些独特的列?