5

我正在学习关系模型和数据建模。
我对子类型有些困惑。

我知道数据建模是一个迭代过程,并且有许多不同的方法来建模事物。
但我不知道如何在不同的选项之间进行选择。

例子

假设我们要对粒子(分子、原子、质子、中子、电子……)进行建模。
为简单起见,让我们忽略夸克和其他粒子。

由于相同类型的所有粒子行为相同,我们不打算对单个粒子进行建模。
换句话说,我们不会存储每个氢原子。
相反,我们将存储氢、氧和其他原子类型。
我们要建模的实际上是粒子类型和它们之间的关系。

我不小心使用了“类型”这个词。
氢原子就是一个例子。氢是一种类型。氢也是一种原子。
是的,涉及类型的层次结构。我们忽略了最低级别(单个粒子)。

方法

我可以想出几种方法来为它们建模。

1. 每一类事物(粒子类型)一个表(关系、实体)。

1.1 我想到的第一种方法。

质子(Proton)
中子(Neutron)
电子(Electron)

Atom (原子)
Atom_Proton (原子、质子、数量)
Atom_Neutron (原子、中子、数量)
Atom_Electron (原子、电子、数量)

分子(Molecule)
Molecule_Atom(分子,原子,数量)

1.2 由于质子/中子/电子只有一种,我们可以简化一下。

Atom (Atom, ProtonQuantity, NeutronQuantity, ElectronQuantity)
分子(Molecule)
Molecule_Atom (Molecule, Atom, Quantity)

在这个简化的模型中,关于Proton的事实丢失了。

2. 所有事物都在一张表中,关联表表示它们之间的关系。

2.1 每个关系一个关联表

粒子(粒子)

Atom_Proton (Particle, Particle, ProtonQuantity)
Atom_Neutron (Particle, Particle, NeutronQuantity)
Atom_Electron (Particle, Particle, ElectronQuantity)
Molecule_Atom (Particle, Particle, AtomQuantity)

2.2 单关联表

粒子(Particle)
ParticleComposition(粒子、粒子、数量)

这种简化不会丢失任何东西。我认为这更好。
但如果有特定于Atom_Proton / Atom_Neutron / Atom_Electron的事实,2.1 可能会更好。

2.3 结合2.1和2.2

粒子(粒子)

Atom_Proton (Particle, Particle, 其他属性)
Atom_Neutron (Particle, Particle, 其他属性)
Atom_Electron (Particle, Particle, 其他属性) Molecule_Atom (Particle, Particle, 其他属性)

ParticleComposition(粒子、粒子、数量、其他属性)

在这种方法中,关于粒子组成的公共属性放在ParticleComposition中,
而关于粒子组成的特殊属性放在特殊的表中。

3. 使用子类型表。

3.1 基本类型Particle的表,以及子类型(AtomMolecule,...)的附加表。

粒子(粒子)

质子(粒子,其他属性)
中子(粒子,其他属性)
电子(粒子,其他属性)
原子(粒子,其他属性)
分子(粒子,其他属性)

Atom_Proton (Particle, Particle, ProtonQuantity)
Atom_Neutron (Particle, Particle, NeutronQuantity)
Atom_Electron (Particle, Particle, ElectronQuantity)
Molecule_Atom (Particle, Particle, AtomQuantity)

3.2 我们也可以将 Atom 中的Atom_XXXQuantity表合并,去掉Pronton / Neutron / Electron

粒子(粒子)

原子(粒子、质子数量、中子数量、电子数量)
分子(粒子、其他属性)

Molecule_Atom (Particle, Particle, AtomQuantity)

它更简单,但有关质子/中子/电子的信息在 1.2 中丢失了。

3.3 我们可以更改Molecule_Atom的名称,使其更通用。

粒子(粒子)

原子(粒子、质子数量、中子数量、电子数量)
分子(粒子、其他属性)

ParticleComposition(粒子、粒子、数量)

这看起来像 2.2,带有子类型( AtomMolecule)的附加表。
看来 2.2 是 3.3 的特例。

3.4 我们可以结合以上所有方法,得到一个通用模型。

粒子(粒子)

质子(粒子,其他属性)
中子(粒子,其他属性)
电子(粒子,其他属性)
原子(粒子,其他属性)
分子(粒子,其他属性)

ParticleComposition(粒子、粒子、数量、其他属性)

Atom_Proton (Particle, Particle, 其他属性)
Atom_Neutron (Particle, Particle, 其他属性)
Atom_Electron (Particle, Particle, 其他属性)
Molecule_Atom (Particle, Particle, 其他属性)

似乎Atom_ProtonAtom_NeutronAtom_ElectronMolecule_Atom可以被认为是ParticleComposition子类型

这种方法是最复杂的一种,它包含许多表,但每个表都有其作用。

问题

  1. 以上任何设计是否违反了关系模型的规则?
  2. 哪种方法最好?这是否取决于我们如何看待数据?这取决于要求吗?
  3. 如果取决于需求,我们是否应该先选择最简单的设计,然后再使其更通用以适应新的需求?
    虽然生成的数据模型有很多相似之处,但最初的设计可能会影响表/列的命名,并且键的不同。

    • 如果我们选择为每种类型的事物使用一个表,我们可以为 Atom 和 Molecule 选择不兼容的键,例如Atom原子重量Molecule分子名称
    • 如果我们选择使用通用方法,我们可以为所有粒子选择一个公共密钥。
      更改密钥可能会对系统产生更大的影响,因此从简单的设计发展到通用的设计可能并不容易。
      你怎么看?

PS:这可能不是一个合适的例子,解决方案可能有问题,并且方法可能有更多变体,但您希望能明白这一点。
如果你有更好的设计,请与我分享。


更新 1

要建模的数据是什么?

最初,我试图对粒子进行建模,因为

  • 我认为它们之间存在子类型关系,这正是我正在寻找的。
  • 他们很容易被人们理解(?)。
  • 这是人们如何理解世界的一个很好的例子。

这是我脑海中的画面。 粒子层次

我没有明确说明这一点,因为我也不太清楚我要建模的内容。
首先,我认为 Atom 是 Proton/Neutron/Electron 的父母,而 Molecule 是 Atom 的父母。
然后我意识到这是关于组合,而不是子类型,而不是类型层次结构

类型

我一直在思考类型,以及分组和分类。

以下是“ SQL 与关系理论”中的一段话:

那么,究竟什么是类型?本质上,它是一组命名的、有限的值——某种特定类型的所有可能值:例如,所有可能的整数,或所有可能的字符串,或所有可能的供应商编号,或所有可能的 XML 文档,或所有可能的关系某个标题(等等)。

人们创造了“整数”这个名称来表示整数值的集合。
实际上,人们创造了概念和名称来识别事物,对事物进行分组,以便我们可以理解/模拟世界。

质子是一组真正的质子,氢是一组氢原子,依此类推。
从这个意义上说,真正的粒子处于类型层次结构的最低级别
起初我试图对所有粒子进行建模,但后来我被卡住了,因为

  • 我想不出一个合适的键来识别每个真实的粒子。
  • 它们太多了,无法存储在数据库中。

所以我决定忽略真实的粒子,而是对类型进行建模。

当我们说“分子由原子组成”时,意思是“一个真正的 H2O 分子由两个真正的氢原子和一个氧原子组成”,也意味着“任何(类型)分子由(某些类型的)原子”。

我们可以只陈述关于粒子类型的事实,而不是陈述关于真实粒子的每一个事实。
这就是我们通过对事物和创造的名称(类型)进行分组而获得的好处。

粒子类型层次作为集

层次结构可以转换为集合定义。

第二级 - 真实粒子之上的类型:

S_proton = { p | p satisfied the definition of a proton }  
S_neutron = { n | n satisfied the definition of a neutron }  
S_electron = { e | e satisfied the definition of an electron }  
S_hydrogen = { h | h satisfied the definition of a hydrogen }  
S_oxygen = { o | o satisfied the definition of an oxygen }  
S_h2o = { w | w satisfied the definition of a h2o }  
S_o2 = { o | o satisfied the definition of a o2 }

更高级别

使用集合论的术语,如果 A 是 B 的子集,则类型 A 是 B 的子类型。

我首先认为我们可以将 Atom 类型定义为:

S_atom = S_hydrogen union S_oxygen union ...

但是,集合是关系,元素是元组,所以如果关系中的元组不兼容,联合就不起作用。

使用子类型表的方法可以解决问题并对子集关系进行建模。

但在子类型化方法中,Atom 仍处于第二级

在此处输入图像描述

更高级别的类型被定义为集合的集合。

S_atom = { S_hydrogen, S_oxygen, ... }
S_molecule = { S_h2o, S_o2, ... }
S_particle = { S_proton, S_neutron, S_electron, S_atom, S_molecule }

这意味着粒子是原子的类型,原子是氢的类型。

这样,粒子之间的关系可以在高层次上表示。

新的数据模型

4. 将类型视为类型的层次结构

ParticleType (ParticleType, Name)
ParticleTypeHierarchy (ParticleType, ParentType)
ParticleComposition (PartileType, SubParticleType, Quantity)

样本数据:

粒子类型

| 粒子类型 | 姓名 |
|-------------+----------|
| 粒子 | 粒子 |
| 质子 | 质子 |
| 中子 | 中子 |
| 电子 | 电子 |
| 原子 | 原子 |
| 分子 | 分子 |
| H | 氢气 |
| ○ | 氧气 |
| 水 | 水 |
| 氧气 | 氧气 |

粒子类型层次结构

| 粒子类型 | 父类型 |
|---------------+------------|
| 质子 | 粒子 |
| 中子 | 粒子 |
| 电子 | 粒子 |
| 原子 | 粒子 |
| 分子 | 粒子 |
| 氢气 | 原子 |
| 氧气 | 原子 |
| 水 | 分子 |
| 氧气 | 分子 |

粒子组成

| 粒子类型 | 子粒子类型 | 数量 |
|-------------+-----------------+----------|
| H | 质子 | 1 |
| H | 电子 | 1 |
| 他 | 质子 | 2 |
| 他 | 中子 | 2 |
| 他 | 电子 | 2 |
| 水 | H | 2 |
| 水 | H | 2 |
| 水 | ○ | 1 |
| 二氧化碳 | C | 1 |
| 二氧化碳 | ○ | 2 |

为了比较,这是子类型表方法的示例数据。

粒子

| 粒子 ID | 粒子名 |
|------------+----------------|
| H | 氢气 |
| 他 | 氦气 |
| 李 | 锂 |
| 是 | 铍 |
| 水 | 水 |
| 氧气 | 氧气 |
| 二氧化碳 | 二氧化碳 |

分子

| 分子 ID | 一些属性 |
|------------+----------------|
| 水 | ... |
| 氧气 | ... |
| 二氧化碳 | ... |

原子

| 原子标识 | 质子数量 | 中子数量 | 电子数量 |
|--------+----------------+-----------------+----- -------------|
| H | 1 | 0 | 1 |
| 他 | 2 | 2 | 2 |
| 李 | 3 | 4 | 3 |
| 是 | 4 | 5 | 4 |

粒子组成

| 粒子 ID | 组件 ID | 数量 |
|------------+-------------+----------|
| 水 | H | 2 |
| 水 | ○ | 1 |
| 二氧化碳 | C | 1 |
| 二氧化碳 | ○ | 2 |
| 氧气 | ○ | 2 |

亚原子

这些粒子类型是由人们定义的,人们不断定义新概念来模拟现实的新方面。
我们可以定义“子原子”,层次结构如下:

具有子原子的粒子类型层次结构

方法 4 可以更容易地适应这种类型层次结构的变化。


更新 2

要记录的事实

  1. 世界上有不同类型的粒子:质子、中子、电子、原子、分子。
  2. 原子由质子、中子和电子组成。
  3. 分子由原子组成。
  4. 有许多不同类型的原子:氢,氧,......
  5. 有许多不同类型的分子:H2O、O2、....
  6. 一个氢原子由一个质子和一个电子组成;...
  7. 一个 H2O 分子由两个氢原子和一个氧原子组成;...
  8. 不同类型的粒子可能具有特殊的性质,例如原子具有原子量等。
  9. ...
4

3 回答 3

6

初步的

很好的问题,对学习者来说很周到。我认为您真正追求的是讨论,以便获得清晰,这是一个数据建模练习。

  • 我了解您升级到并包括 3.3。什么,如何,你得到 3.4(在逐步发展到 3.3 之后)?对我来说,结合以上所有不等于Generic

  • 根据你的讨论,让我用一个 TRD 来回应相关步骤,而不是跟随你的进展,并为每个步骤建立一个模型。

  • TRD Only Tables,由 Keys 标识,并且关系在这个阶段是相关的,我想你很清楚 Attributes(如果有的话)以及它们将与哪些 Keys 一起部署。获得稳定的 TRD 后,您可以将其扩展为完整的 DM。

  • 在建立一个模型之后,它比前一个模型有了进步,并且经过评估,如果它明显丢失了信息,则可以安全地丢弃它。考虑这样的模型是有价值的,因此该步骤没有错误。但是继续讨论它是一种浪费。我相信我在上一个问题中证明了这一点。

考虑这组表关系图

1.x

从我的角度来看,A First将是第一个值得考虑的合理 TRD。

  • 我不明白质子/中子/电子如何或为什么是独立表。它们不是独立存在的,它们的重量;等是固定的。它们仅存在于 Atom 的上下文中。

  • 由于每个 Atom 至少包含一个质子/中子/电子,因此质子/中子/电子柱可以部署在 Atom 中。没画。之后。

2.x

你的进展很好,除了一个明显的错误。

关于粒子组成的通用属性放在 ParticleComposition 中,而关于粒子组成的特殊属性放在特殊的表中。

没有。关于粒子的通用属性在粒子中。特定于关系的属性(即不常见的)进入 ParticleComposition。然后没有“关于粒子组成的特殊属性”,没有“特殊表格”。

3.x

考虑B 子类型。你的 [3.1] 大部分是正确的,除了:

  • 我不明白 Particle 是如何拥有诸如质子/中子/电子之类的孩子的。只有 Atom 有。

  • 我看不到粒子与其他粒子的关系(即那是什么?)。对于所讨论的数据,分子由原子组成;原子由质子/中子/电子组成;并且粒子是分子 x 或原子(专有子类型)。

  • 如果不正确,请纠正我。

  • 有关该主题的完整详细信息,请参阅子类型文档

正如您所说,这可以是C Reduced 。这持有这样一种概念,即质子/中子/电子信息对于每个原子都是固定的:每个原子都有一个条目。例如。每个壳层/能级没有区别;Neutrons 可以接受零(而不是 Null)。

  • 我之前已经讨论过 Predicates 的巨大价值。这里的要点是,模型识别谓词。谓词验证模型;这是一个很好的反馈循环。我已经给出了谓词,以便您可以自己评估它们,并检查模型的有效性。

3.3

如果它是完全D 归一化的:原子总是至少有一个质子条目;中子条目是可选的;并且每个壳层/能级都是不同的。

  • 注意谓词的区别。

  • 请注意,尽管Reduction是一种有效的技术,但它并不等同于Normalization

3.4

这似乎是所有东西的总和,平面布局或平面视图(派生关系、透视、结果集)。因此,这很好,便于理解。但是,如果您将其作为一组表提出,那么由于各种规范化错误,它是非常不正确的。如果更正,将进展到 [3.3] 和我的 [D Normalized]。

问题

以上任何设计是否违反了关系模型的规则?

除了 [3.3] 之外,它们都违反了许多规则。大多数情况下,它们属于标准化错误。如果您要给出完整的模型或 CREATE TABLE 语句,则会出现相关的识别错误。

但这并不重要,如果上下文是数据建模练习,为了理解。如果这个练习是认真的,那么上面的段落就成立了。

本节是根据 SO 指南呈现的,特别是:在您看到错误信息时纠正错误信息。我确实对主题帖子发表了评论,但他们一直在消失。因此我把它放在这里。

Erwin Smout:
从本质上讲,数据的关系模型只有一个“规则”:数据库中的所有信息都必须表示为关系元组中的属性值。

是的,这是规则之一,但随附的陈述显然是错误的。

首先,关系模型中有许多基本规则或一阶规则。从记忆中,我会说四十左右。

其次,有许多二阶规则,它们在逻辑上被一阶规则所暗示。

  • 有技术资质和经验的人,懂RM的人,遵循精神和意图的人,都遵循。

  • 其他人可能无法识别某些一阶规则或大多数隐含规则。

  • 从声称是关于RM的书籍中可以看出,还有一些人积极地颠覆和削弱了RM。他们忽略了二阶规则,更糟糕的是,他们使用法利赛式的“逻辑”来破坏一阶规则。

  • 在这里,以在 comp.databases.theory 和 TTM 上的RM方面的努力而闻名的 Erwin 将RM简化为一个简洁的规则,从而破坏了整套规则以及RM本身。特别是在回答您的问题时,如果不是我的回答,这将使读者相信RM就是他所说的那样:只有一条规则,即关系和非关系的一切都“满足”。

  • 关系模型是免费提供的,您可以自己阅读。让我知道你是否想要一份副本。需要注意的是,术语已经过时,需要解释。

其次,即使将其归结为一条规则(不可能,过于简化)或最重要的规则(可能,但贬低),那条规则也不会是它。这是四十条左右的一阶规则之一,但肯定不是排名靠前的。

  • 但是,我承认其他人可能有不同的排名,以适应他们自己的目的。

  • 作为RM与其前辈之间的主要区别(而非规则),了解RM的 人所讨论的是:

    • 它是第一个拥有完整的数学定义的(它构成了它的基础,其中的一切都源于此)。

    • 前辈使用物理记录 ID 关联记录,而RM要求 (a) 由数据组成的逻辑键,以及 (b) 通过这些逻辑键关联行(而非记录)。

必须提到的是,这是在每个文件中以记录 ID 为特征的系统的基础,声明为“主键”,是完全非关系的,回归到 1970 年之前的 ISAM 记录归档系统,就是这样RM已经过时了。还要注意,这些原始系统是如何看起来是“关系的”,因为通过精神分裂症的“逻辑”,它们“满足”了一个引用的规则。诚实的逻辑摧毁了这种胡说八道。

正是由于错误信息,这种基于记录 ID 的系统已成为行业低端的规范。因此我愿意纠正它。

结束错误信息纠正部分。

哪种方法最好?

正式数据建模,包括关系规范化。方法、科学、原则,而不是 NF 定义的片段。

我不认为这些建议是不同的方法,而是在一次建模练习中展示你所有的想法。模型开始采取严肃、可行的形状的点是[3.3]。

这是否取决于我们如何看待数据?

当然。你的婚姻成败取决于你对妻子的看法,因为这种看法是你所有行动的基础。该模型将根据您对数据的感知成功或失败。

关系模型的一大优点是它教会我们将数据视为(感知、思考、建模)数据,而不仅仅是数据。一方面,这形成了逻辑密钥的概念。

这取决于要求吗?

第一个答案是,不,它不应该取决于要求。它应该考虑数据,其范围仅限于企业(需求,是的,但不是功能需求),并且只考虑数据。

当然,由于我在别处详述的原因,数据模型应该与现实世界相匹配,它不应该局限于针对数据的功能需求。

OO/ORM 模型失败的常见原因是大规模错误,它是从 OO/ORM 模型的微小镜头中感知数据的。它无法将数据与进程分开,并将数据视为对象的单纯“持久性”奴隶。那个模型还有很多其他的错误,这里就不一一列举了,重点是,都是从需求的位置开始的,忽略了数据。

第二个答案是,一个项目在需求确定之前不会被委托,如果资金是基于需求的现实。因此,成熟的项目负责人确保需求包含足够的理由来分析和建模数据,作为数据,与功能分开。

如果取决于需求,我们是否应该先选择最简单的设计,然后再使其更通用以适应新的需求?

你可以,但这会花费很多。成熟的顺序是尽可能早地得到正确的数据模型。

如果数据模型与现实世界相匹配,当出现更改和添加时,它很容易扩展。相反,如果数据模型是功能需求的最小值,或者它与现实世界不匹配,那么更改将变得困难且成本高昂。

虽然生成的数据模型有很多相似之处,但最初的设计可能会影响表/列的命名,并且键的域不同。

当然。

如果我们选择为每种类型的事物使用一个表,我们可以为 Atom 和 Molecule 选择不兼容的键,例如 Atom 的原子重量和 Molecule 的分子名称。

那将是一个可怕的错误。切勿将物品放入与标签不符的容器中。切勿将两种不同的东西放在一个容器(只有一个标签)中。正确的方法是使用通用标识符名称(即原子名称或分子名称或粒子名称),并使用子类型。

如果我们选择使用通用方法,我们可以为所有粒子选择一个公共密钥。

只要有一个。如果没有,则表明实体不相同,即不能使用通用模型。

更改密钥可能会对系统产生更大的影响,因此从简单的设计发展到通用的设计可能并不容易。

好吧,这个想法是选择稳定(非静态)的数据项来形成密钥。是的,关键设计是建模练习的一个重要方面。如果您遵循关系模型,则键构成数据库的逻辑结构。域非常重要(我认为您意识到这一点)。是的,改变成本很高。

这让我们回到了重点。这正是必须为每个表及其所有子表正确建模和选择键的原因。

更新 1 和 2

我刚刚注意到你的两个更新。这不是一个完整的回应,现在只是一个很短的回应。

  • 到目前为止,我将粒子理解为原子的集合加上分子的集合。这就是我在D Normalized中建模的内容。两者都有一个名称,一个共同的密钥。它是亚型的。

但是现在,鉴于您的层次结构图和示例数据(谢谢),我意识到我认为您的意思和您的意思是两件不同的事情。考虑更新的 TRD 和层次结构

  1. 你的粒子是一组分子加上一组原子加上一组亚原子粒子。

    • 这是不正确的

    • 有一个层次结构,是的,但到目前为止,它存在于表的序列中,而不是一个表中的层次结构。

    • 换句话说,这两组(原子,分子)是离散的,每个都有自己的一组组件,它们是不同的。没有集合包含所有内容(理论全集除外)。

    更新后的表关系模型是E 归一化 • 更新 2。子类型已与粒子一起被删除。它提供了更新 2 中所述的所有要求。请注意更新的谓词。

  2. 您的层次结构图不正确。

    • 您的错误是您将分类器的层次结构(结构、容器)与数据(分类器的实例;内容)结合在一起。你不能那样做。您需要两个单独的图表,一个用于容器,另一个用于内容。

    • 这是 OO/ORM 思维方式的典型错误。未能遵守将数据与流程分开的科学原则。我在上一个问题中对 Hidders 的回复中详述了完全相同的错误。结果是复杂的对象,它永远不会真正起作用。

    • 所以你的层次图是非法的,它是两个完全不同的图表合二为一。

    F Hierarchy (Classification)描述了这一点,而且仅描述了这一点。

    G Hierarchy(样本数据)说明了这一点,而且仅此而已。

    您描述层次结构的方式(组织结构图)和我描述它们的方式(资源管理器)在风格上有所不同。一个最终非常宽,另一个更紧凑。我想你可以弄清楚

  3. 你在上一个问题的结尾有一些清楚的地方。在那本有毒的书中, Type的新概念让你完全糊涂了。这个问题,这些问题,跟Type没有关系。

要求更多的话,我会在时间允许的情况下更充分地回应。

于 2015-06-02T12:41:06.570 回答
3

归根结底,数据的关系模型只有一个“规则”:数据库中的所有信息都必须表示为关系元组中的属性值。

您的所有“替代方案”都可能符合该规则,前提是:
- 每个属性都有一个关联的数据类型,
- 并且数据库中每个关系中的每个元组将始终为其每个属性都有一个值,
- 并且该值是一个值,它是与该属性关联的数据类型的成员。

编辑:您也未能提供任何关于您想要在系统中记录的事实的确切性质的详细信息。

编辑 2:Walter M. 的第一条评论仍然适用。您的事实似乎在不同的层面上陈述了事情(在典型的用例中会明显不同):

“6.氢原子由一个质子和一个电子组成”

经过小的重写以消除其中的“与”:

“6. <atom_id> 原子包含 <qty> <subatomicparticletype>”

这个看起来像是会进入你的数据库的东西(如果你的用例像想象的那样典型/平凡):

一个“H”原子包含 1 个质子
一个“H”原子包含 1 个电子
一个“H”原子包含 1 个中子

(请注意消除“与”如何涉及将连词分成“原子”部分(双关语)。)

从这个开始,我们可以开始思考如何处理 <subatomicparticletype>。如果您的用例是质子/中子/电子的存在只是给定的,并且永远不会改变,那么您可以简单地为它使用数据类型,并且对其建模只涉及识别类型以便您的模型的读者将知道预期的值集。但是,如果您的用例是这样的,例如,您正在尝试寻找一种全新的化学模型,在该模型中,质子旁边也可能存在 foobarons [或者为了实验,它们的存在可能再次被删除],那么你必须包含一个表,上面写着“<subatomicparticletype> 是我的原子模型的一部分”。

此外,您还必须在模型中包含一条规则,即声称是原子一部分的任何 <subatomicparticletype> 必须确实是原子模型的一部分。在 SQLspeak 中:您需要从 ATOM_CONTAINS_PARTICLE 表到该 EXISTING_PARTICLES 表的 FK。

从某种意义上说,这条规则的声明就像你的

“2. 原子由质子、中子和电子组成。”

但请注意,您自己的数据库中不会有一个表来说明这种事情。相反,通过向系统声明 FK,此特定声明将在目录中进行。

您需要正确区分直接陈述感兴趣领域事物的语句类型(最终成为概念模型中的实体/类/......以及数据库中最有可能的表)和陈述有关感兴趣领域的事情的陈述(例如您的 FK 规则)。

(在域本身高度抽象的用例中,两者之间的界限可能非常细,甚至不存在。)

于 2015-06-01T10:06:28.940 回答
1

我喜欢 Fowler 对类表继承和单表继承的处理。您在这里已经触及了这两种设计。它们中的每一个都有其用途和缺点。您可以将这些用作搜索词,并且您会阅读很多内容。其中一些是值得的。SO中甚至还有几个带有这些名称的标签。

我不确定今天的情况,但是大约 20 年前,Database 101 课程中经常忽略子类型,这是每个数据库构建者进入“现实世界”时都会遇到的问题。

于 2015-06-01T09:24:03.517 回答