- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在设计一个数据库,其中两个字段具有多对一关系,但我还需要它们之间存在一对一关系,我想请教一下是否有更好的方法比我现在得到的还要多。
我的表是accounts
和users
。一个帐户可以有多个用户,但每个帐户只能且必须有一个所有者。一个用户只能与一个帐户相关。
我在 users
表中有一个 account
字段,它存储与用户相关的帐户的 ID。在 accounts
表中,我有一个 owner
字段,它存储拥有该帐户的用户的 ID(即主管管理员)。
我正在使用 InnoDB,因此我可以使用外键。问题是,如果没有先创建另一个帐户或用户(由于外键的限制),我无法创建帐户或用户,因此我将 owner
设置为可为空。现在我可以创建一个具有空 owner
的帐户,然后创建用户,最后将帐户上的 owner
设置为用户。
这是否可以接受,是否有更好的方法?
以下是我想到的其他一些可能的方法,以及我对每种方法的看法:
users
表中有一个 bool 值 owner
字段。由于每个帐户只能有一个所有者,这种方式似乎不太理想,因为我必须确保每个帐户只有一个用户将属性设置为 true
。
有一个名为 owners
的第三个表。这似乎是无缘无故的更多开销和更多工作,因为它实际上与 users
表中的 owner
字段相同。
我现在拥有它的方式对我来说最有意义,但是在我创建用户之前必须设置一个空所有者,然后在事后回来设置它有点尴尬。
如果您能给我任何意见,我将不胜感激。谢谢!
这个问题很相似,但是没有提到外键:Designing Tables: One to many and one to one at same time?
最佳答案
如果您的架构无法按拓扑排序,即如果您无法建立一个表仅引用排序中它前面的表的排序,则通常是一个坏主意。这种“分层”依赖性也是一个非常好的属性,例如对于软件模块(如果两个模块相互依赖,就会出现问题)。
在您的情况下,您有指向帐户的用户和指向用户的帐户,所以显然无法找到拓扑排序。
在这种情况下,一个标准的解决方案是引入一个单独的表,例如“角色”,其中包含三列:用户、帐户和角色。列角色可以是“所有者”或“访客”。
您知道(鉴于当前的请求)一个帐户必须有一个且只有一个所有者,或者一个用户必须在一个且只有一个帐户中列出的事实不是真正与领域相关的 IMO 规则“用户”和“帐户”。
您可以轻松地实现这些规则,但在我看来,将数据结构化以使您没有其他可能性是错误的。您的目标应该是为领域建模,而不是特定规则...因为人们会改变他们对这些规则是什么的看法。
您能设想一个拥有两个帐户的用户吗?您可以设想一个拥有多个所有者/管理员的帐户吗?我可以...这意味着很可能很快就会提出请求。构建数据以使其无法表示这是在自找麻烦。
此外,当您在模型中具有循环依赖性时,您的查询将更难编写。
例如,一个非常常见的情况是尝试仅使用一个表来表示分层零件列表数据库,该表的“父”字段指向表本身......多有两个更好取而代之的是零件和组件表,其中组件有两个对零件和数量的引用。
关于mysql - 同一张表上的多对一和一对一关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6681989/
我在使用一对一映射时遇到问题。我搜索了互联网并找到了许多解决方案,但没有一个令人满意。大多数示例都带有将父实例存储在子类中的开销。 我只想在具有外键约束关系的子类中使用父 ID,但不想在子类中保留任何
我有以下设置: Micronaut 3.x Java 15 我要更新的实体: @Setter @Getter @Entity @ToString @Table(name = "single_choic
我正在使用AVAudioPlayer制作MP3播放器。我有多种MP3声音,想一一播放。以下是我的应用程序的逻辑: ///// For playing 1st sound mp3Player = [[A
所以这就是问题所在。我有 2 个模型: 裁判级别和裁判 两个都有: class RefereeLevel(models.Model): level = models.PositiveSmall
我想将数组添加到列表或多维数组(不是一次全部...)。但是我真的不明白为什么这应该那么难。 可以说我有这个: string[] a = { "h", "b"}; string[] b
我有一个长度为 1000 的数字序列,我将其分成 100 个长度的序列。所以我最终得到了 901 个长度为 100 的序列。让前 900 个序列为 trainX。 trainY 是这些序列中的第 2
关键字:association 一对一映射(一个班级只有一个班主任) ?
所以,这是我第一次学习计算机语言。我选择了python和django。现在,我了解了 python 和 django 的许多基本概念。我可以使用 View 和所有其他内容创建新页面。但我仍然对这些关系
在一对一映射中,我编写了以下代码行。 @GenericGenerator(name = "generator", strategy = "foreign", parameters = @Paramet
我有两个如下所示的实体 @Data @EqualsAndHashCode(callSuper = true) @Entity @Table(name = "foo") @Audited @AuditO
我的问题很简单.. 假设有 2 个类..书籍和作者 假设一本书只能由一位作者撰写。 一个作家可以写很多本书。 假设作者有唯一的名字。 [两个作者不能同名] 现在..假设所有 hibernate\JPA
我正在尝试创建一个实体,如下所示 @Data public class Person { @Id private String id; @OneToMany(mapp
我有一个包含字段的Project表 ID PROJECT_BASELINE_ATTRIBUTES_ID (FK for table PROJECT_BASELINE_ATTR) 这个表有如下映射
我正在学习基本的 hibernate 教程。我正在尝试在 2 个表之间建立一对一的关系。当我尝试插入 Client 表时它起作用了,但是当我尝试做相反的事情时(插入 Facture 表)我得到了这个异
我已经在 hibernate 3 中使用注释完成了一对一映射,我有两张表“组”和“类别”。类别是预定义的。当用户选择类别和组时,CategoryId和goupid应该只插入组表中。 那么应该如何映射。
我使用Linux服务Fedora 4.14.33-51.37.amzn1.x86_64。我想使用 NAT 1 对 1。例如是否相同problem我的方案是:我的服务器有两个网络接口(interface
我正在尝试与实体 Revision 创建一对一、自引用、双向关系(哇),看起来像这个: /** * @Entity() * @Table(name="rev") */ class Revisio
我需要两个实体之间的链接,所以我使用一对一 @Entity @Table(name = "T_USER") public class User implements Serializable {
一对一: 一对一的关系极为一个数据仅对应一个数据,用下图的结构图可以帮助理解: 下面用代码实现一下,首先要创建工程项目如下: 接着,我们定义模型: 来到models.py文件,创建两
假设我有5列。 pd.DataFrame({ 'Column1': [1, 2, 3, 4, 5, 6, 7, 8, 9], 'Column2': [4, 3, 6, 8, 3, 4, 1, 4, 3
我是一名优秀的程序员,十分优秀!