假设Group和Member是两个java对象。每个成员在一个组中只出现一次,一个组有零个或多个成员。这两个对象的属性几乎相同。但是,成员从其所属的组继承其值。但是成员的价值也可以被覆盖。
在数据库中设计此方法的最佳方法是什么?我唯一能想到的是有两个代表这两个对象的表。但这意味着成员表包含许多类似的值。
Group table
id| attr1 | attr2 |
---------------------
1 | value1 | value2 |
Member table
id| attr1 | attr2 | group_id | attr3 |
----------------------------------------
1 | value1 | value2 | 1 | foo |
2 | bar | value2 | 1 | foo |
正如您所看到的,成员1已从组1“继承”其值并具有自己的attr3值foo
。成员2也从组1“继承”了值,但其attr1值已被bar
覆盖。
答案 0 :(得分:2)
在数据库中设计它的最佳方法是什么?
最好的方法是理解科学原理,数据和程序元素(包括对象)是完全不同的物种,每种都有不同的分析,设计和实施方法和规则。一个真正的男人和一个真正的女人结婚,正是因为每个人都不同。迷茫或陷入困境的伴侣会造成灾难性的婚姻。
因此,我将使用标准解决您问题中的数据要求,以便数据稳定和易于扩展。您可以自由地使用标准构建任何对象,这样对象就可以稳定且易于扩展。或者不是。
以下是支持您声明的要求的规范化关系数据库。
Group vs Member Attribute Data Model
No Nulls。没有任何重复。没有更新异常。
在默认情况下,Group属性是Members属性。这些默认值不应存储在每个成员中,这将是大量且不必要的重复。
您需要成员属性的可选列,如果设置,则覆盖默认属性。
提供了关系密钥,这意味着您将拥有最高级别的关系完整性,功能和速度。鉴于您的问题的级别,您现在可能不会欣赏它的价值,但是一旦您开始编码,您将会很感激。
这是一个IDEF1X数据模型。 IDEF1X是关系数据库建模的标准。请注意每一个小嘀嗒声;缺口;并标记;乌鸦脚;实线与虚线;广场与圆角;意味着非常具体和重要的东西。请参阅IDEF1X Notation。如果您不理解符号,您将无法理解或工作该模型。
当然,一个成员应该在每个组中只出现一次(否则你会有行重复,这在 Relational Model 中被禁止)。
然而,会员从其所属的集团继承其价值
这意味着每个成员只属于一个集团。
如果会员可以属于多个集团,我们必须(a)指定他从哪个集团接收默认属性,以及(b)更改模型。这很容易。
如果您想要谓词,请询问。
在数据库中设计它的最佳方法是什么?
当然,这会导致下一个显而易见的问题:设计对象以使用数据库的最佳方法是什么?
如果我在你的位置,我将使用View each,收集Group的所有数据,以及Member,然后使用它来加载你的对象。如果您需要代码,请询问。
保持对象简单,您不需要在对象中实现“继承”。也就是说,将数据问题保存在数据库中,对象在对象中发布,不要扰乱你的蛋。我们构建用于部署的软件组件,而不是1970年之前的单片对象层。
当然,使用ACID Transactions更新数据库,而不是OO或ORM“持久性”。
毕竟是2015年,自1970年以来我们已经拥有关系模型;自1984年以来,包括ACID在内的SQL平台。没有必要回归到古代文件系统。我发出此警告是因为我非常清楚OO / ORM人群建议实施关系前备案系统。
请随时提出问题或发表评论。
答案 1 :(得分:0)
您可以尝试让Member表中的attr1和attr2字段最初包含NULL。并且您将能够检查attr1或attr2是否为NULL,而不是查询Group表所需的值 如果attr1和attr2包含一些值,则表示这些字段被覆盖。