首页 > 解决方案 > 具有多个关系和继承的实体的灵活数据库结构

问题描述

我正在设计一个具有一些特定规则的数据库结构,并且我正在尝试定义一个合适的数据模型,基本上是一个符合这些规则的模型。

有3个实体:

  1. 组(字段:subgroupsitems...)
  2. 子组(字段:groupitems...)
  3. 项目(字段:enableddescription...)

这些实体具有关系:

还有一些特殊的规则:

这个例子很简单,但实际情况要复杂一些,可以有更多的“SubGroup”级别,比如“SubSubGroup”,所以结构也应该优雅地处理这些


尝试 1

起初,我想象了一种传统的关系:

在此处输入图像描述

如果不是那些“特殊规则”,这会很好。因为这种结构无法覆盖继承的Item.

因此,我也再次尝试处理这些问题。


尝试 2

ItemOverride 除了现有的实体GroupSubGroupItem

该实体ItemOverride包含以下字段:

实体ItemOverride扩展Item实体,使其包含相同的字段,允许覆盖任何字段。

ItemsOverride表格内容示例:

+--------+------------+----------+-----------------+---------------------+
| ItemId | EntityType | EntityId | Enabled         |    OverriddenHeight |
+--------+------------+----------+-----------------+---------------------+
|     1  | group      |        1 | true            | null                |
|     2  | group      |        2 | true            | 20                  |
|     3  | subgroup   |        1 | false           |                     |
+--------+------------+----------+-----------------+---------------------+

这个设计似乎提供了正确的结构,我添加OverriddenWidthOverriddenHeight说明了被覆盖的字段。关键是只存储被覆盖的内容并将其他值留空,以便它依赖于实际Item实体来获取这些值。

但是,我觉得它变得比需要的复杂得多,我想知道是否没有更好的方法来处理这个问题。

以下是我可以通过这种结构看到的一些潜在痛点:

所以,我不知道这个设计是否“足够好”,或者可以改进/简化。如果您知道的话,我有兴趣潜入具有此类继承/覆盖需求的类似项目。


概括:

我的第二次尝试似乎符合我的需求,如果我必须立即开始,我会使用它,因为我不知道如何改进它。

这种设计没有数据冗余,但仍然不清楚当 aSubGroup继承 aGroup时如何处理数据覆盖Item。如果覆盖仅限于required字段,那么它相当容易,但如果它有很多字段,那么维护起来就会变得有点复杂。使用模型/表继承也可能使事情复杂化,因为我们不想存储非覆盖值,因此希望允许表null中的所有字段(如果我们在实体ItemOverride中强制执行不可为空的规则,这可能是不可能的Item因为它们也将应用于ItemOverride

问题:有没有办法同时使用继承和覆盖而不复制列配置和数据本身?


作为记录,我正在使用 Django。其强大的内部 ORM 可以优雅地处理ContentTypesDynamicRelationship,它们允许使用模型的字段引用动态实体。(我称之为EntityType/EntityId),这就是为什么第二次尝试设计是这样设计的原因之一(更容易依赖我的框架提供的东西)。但我对完全不同的可能性/选择持开放态度。

标签: databasedatabase-designrelational-database

解决方案


推荐阅读