在数据库中表示/设计组和成员的最佳方法是什么

时间:2015-05-19 21:14:50

标签: database database-design

假设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覆盖。

2 个答案:

答案 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包含一些值,则表示这些字段被覆盖。