我正在学习关系模型和数据建模。
我对子类型有些困惑。
我知道数据建模是一个迭代过程,并且有许多不同的方法来建模事物。
但我不知道如何在不同的选项之间进行选择。
例子
假设我们要对粒子(分子、原子、质子、中子、电子……)进行建模。
为简单起见,让我们忽略夸克和其他粒子。
由于相同类型的所有粒子行为相同,我们不打算对单个粒子进行建模。
换句话说,我们不会存储每个氢原子。
相反,我们将存储氢、氧和其他原子类型。
我们要建模的实际上是粒子类型和它们之间的关系。
我不小心使用了“类型”这个词。
氢原子就是一个例子。氢是一种类型。氢也是一种原子。
是的,涉及类型的层次结构。我们忽略了最低级别(单个粒子)。
方法
我可以想出几种方法来为它们建模。
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的表,以及子类型(Atom,Molecule,...)的附加表。
粒子(粒子)
质子(粒子,其他属性)
中子(粒子,其他属性)
电子(粒子,其他属性)
原子(粒子,其他属性)
分子(粒子,其他属性)
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,带有子类型( Atom,Molecule)的附加表。
看来 2.2 是 3.3 的特例。
3.4 我们可以结合以上所有方法,得到一个通用模型。
粒子(粒子)
质子(粒子,其他属性)
中子(粒子,其他属性)
电子(粒子,其他属性)
原子(粒子,其他属性)
分子(粒子,其他属性)
ParticleComposition(粒子、粒子、数量、其他属性)
Atom_Proton (Particle, Particle, 其他属性)
Atom_Neutron (Particle, Particle, 其他属性)
Atom_Electron (Particle, Particle, 其他属性)
Molecule_Atom (Particle, Particle, 其他属性)
似乎Atom_Proton、Atom_Neutron、Atom_Electron和Molecule_Atom可以被认为是ParticleComposition的子类型。
这种方法是最复杂的一种,它包含许多表,但每个表都有其作用。
问题
- 以上任何设计是否违反了关系模型的规则?
- 哪种方法最好?这是否取决于我们如何看待数据?这取决于要求吗?
如果取决于需求,我们是否应该先选择最简单的设计,然后再使其更通用以适应新的需求?
虽然生成的数据模型有很多相似之处,但最初的设计可能会影响表/列的命名,并且键的域不同。- 如果我们选择为每种类型的事物使用一个表,我们可以为 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
要记录的事实
- 世界上有不同类型的粒子:质子、中子、电子、原子、分子。
- 原子由质子、中子和电子组成。
- 分子由原子组成。
- 有许多不同类型的原子:氢,氧,......
- 有许多不同类型的分子:H2O、O2、....
- 一个氢原子由一个质子和一个电子组成;...
- 一个 H2O 分子由两个氢原子和一个氧原子组成;...
- 不同类型的粒子可能具有特殊的性质,例如原子具有原子量等。
- ...