草庐IT

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

coder 2023-10-10 原文

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

我的表是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 - 同一张表上的多对一和一对一关系?的更多相关文章

  1. ruby - Highline 询问方法不会使用同一行 - 2

    设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案

  2. ruby-on-rails - date_field_tag,如何设置默认日期? [ rails 上的 ruby ] - 2

    我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问

  3. ruby-on-rails - openshift 上的 rails 控制台 - 2

    我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新ruby​​gems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems

  4. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

    我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

  5. ruby - Rails 关联 - 同一个类的多个 has_one 关系 - 2

    我的问题的一个例子是体育游戏。一场体育比赛有两支球队,一支主队和一支客队。我的事件记录模型如下:classTeam"Team"has_one:away_team,:class_name=>"Team"end我希望能够通过游戏访问一个团队,例如:Game.find(1).home_team但我收到一个单元化常量错误:Game::team。谁能告诉我我做错了什么?谢谢, 最佳答案 如果Gamehas_one:team那么Rails假设您的teams表有一个game_id列。不过,您想要的是games表有一个team_id列,在这种情况下

  6. 使用canal同步MySQL数据到ES - 2

    文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co

  7. [工业相机] 分辨率、精度和公差之间的关系 - 2

    📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

  8. ruby-on-rails - Ruby - 如何从 ruby​​ 上的 .pfx 文件中提取公钥、rsa 私钥和 CA key - 2

    我有一个.pfx格式的证书,我需要使用ruby​​提取公共(public)、私有(private)和CA证书。使用shell我可以这样做:#ExtractPublicKey(askforpassword)opensslpkcs12-infile.pfx-outfile_public.pem-clcerts-nokeys#ExtractCertificateAuthorityKey(askforpassword)opensslpkcs12-infile.pfx-outfile_ca.pem-cacerts-nokeys#ExtractPrivateKey(askforpassword)o

  9. 带有 attr_accessor 的类上的 Ruby instance_eval - 2

    我了解instance_eval和class_eval之间的基本区别。我在玩弄时发现的是一些涉及attr_accessor的奇怪东西。这是一个例子:A=Class.newA.class_eval{attr_accessor:x}a=A.newa.x="x"a.x=>"x"#...expectedA.instance_eval{attr_accessor:y}A.y="y"=>NoMethodError:undefinedmethod`y='forA:Classa.y="y"=>"y"#WHATTT?这是怎么回事:instance_eval没有访问我们的A类(对象)然后它实际上将它添加到

  10. ruby-on-rails - rails 上的 ruby : radio buttons for collection select - 2

    我有一个集合选择:此方法的单选按钮是什么?谢谢 最佳答案 Rails3中没有这样的助手。在Rails4中,它是collection_radio_buttons. 关于ruby-on-rails-rails上的ruby:radiobuttonsforcollectionselect,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/18525986/

随机推荐