dzh*_*zhu 4 database-design data-modeling relational-database relational-model subtype
我正在学习关系模型和数据建模.
我对子类型有一些困惑.
我知道数据建模是一个迭代过程,有许多不同的方法可以对事物进行建模.
但我不知道如何选择不同的选项.
假设我们想要模拟粒子(分子,原子,质子,中子,电子......).
为简单起见,让我们忽略夸克和其他粒子.
由于所有相同类型的粒子表现相同,我们不打算对单个粒子进行建模.
换句话说,我们不会存储每个氢原子.
相反,我们将储存氢,氧和其他原子类型.
我们要建模的实际上是粒子类型和它们之间的关系.
我不小心使用" 类型 " 这个词.
氢原子是一个实例.氢是一种类型.氢也是一种原子.
是的,涉及的类型层次结构.我们忽略了最低级别(单个粒子).
我可以想到几种模拟它们的方法.
质子(质子)
中子(中子)
电子(电子)
原子(Atom)
Atom_Proton(原子,质子,数量)
Atom_Neutron(原子,中子,数量)
Atom_Electron(原子,电子,数量)
分子(分子)
Molecule_Atom(Molecule,Atom,Quantity)
原子(原子,质子数量,中子数量,电子量子)
分子(分子)
分子 _ 原子(分子,原子,数量)
在这个简化的模型中,关于质子的事实已经丢失.
粒子(粒子)
Atom_Proton(Particle,Particle,ProtonQuantity)
Atom_Neutron(Particle,Particle,NeutronQuantity)
Atom_Electron(Particle,Particle,ElectronQuantity)
Molecule_Atom(Particle,Particle,AtomQuantity)
粒子(粒子)
粒子组成(粒子,粒子,数量)
这种简化不会丢失任何东西.我认为这更好.
但如果存在特定于Atom_Proton/Atom_Neutron/Atom_Electron的事实,2.1可能会更好.
粒子(粒子)
Atom_Proton(粒子,粒子,其他属性)
Atom_Neutron(粒子,粒子,其他属性)
Atom_Electron(粒子,粒子,其他属性)
Molecule_Atom(粒子,粒子,其他属性)
ParticleComposition(粒子,粒子,数量,其他属性)
在这种方法中,关于粒子组成的常见属性在ParticleComposition中,
而关于粒子组成的特殊属性在特殊表中.
粒子(粒子)
质子(粒子,其他属性)
中子(粒子,其他属性)
电子(粒子,其他属性)
原子(粒子,其他属性)
分子(粒子,其他属性)
Atom_Proton(Particle,Particle,ProtonQuantity)
Atom_Neutron(Particle,Particle,NeutronQuantity)
Atom_Electron(Particle,Particle,ElectronQuantity)
Molecule_Atom(Particle,Particle,AtomQuantity)
粒子(粒子)
原子(粒子,质子量子,中子量子,电子量子)
分子(粒子,其他属性)
Molecule_Atom(粒子,粒子,原子量)
它更简单,但关于质子/中子/电子的信息在1.2中丢失了.
粒子(粒子)
原子(粒子,质子量子,中子量子,电子量子)
分子(粒子,其他属性)
粒子组成(粒子,粒子,数量)
这看起来像2.2,附加了子类型表(Atom,Molecule).
似乎2.2是3.3的特例.
粒子(粒子)
质子(粒子,其他属性)
中子(粒子,其他属性)
电子(粒子,其他属性)
原子(粒子,其他属性)
分子(粒子,其他属性)
ParticleComposition(粒子,粒子,数量,其他属性)
Atom_Proton(粒子,粒子,其他属性)
Atom_Neutron(粒子,粒子,其他属性)
Atom_Electron(粒子,粒子,其他属性)
Molecule_Atom(粒子,粒子,其他属性)
Atom_Proton,Atom_Neutron,Atom_Electron和Molecule_Atom似乎可以被认为是ParticleComposition的子类型.
这种方法是最复杂的方法,它包含许多表,但每个表都有自己的作用.
如果它取决于要求,我们首先应选择最简单的设计,然后使其更通用以适应新的要求吗?
虽然生成的数据模型有许多相似之处,但初始设计可能会影响表/列的命名,并且键的域也不同.
PS:这可能不是一个合适的例子,并且解决方案可能存在问题,并且可能会有更多的方法变化,但您可以有希望得到这一点.
如果您有更好的设计,请与我分享.
最初,我试图模拟粒子,因为
这是我脑海中的画面.

我没有明确说明这一点,因为我不清楚我要模拟的是什么.
首先我认为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 }
Run Code Online (Sandbox Code Playgroud)
更高级别
使用集合论的术语,如果A是B的子集,则类型A是B的子类型.
我首先想到我们可以将Atom类型定义为:
S_atom = S_hydrogen union S_oxygen union ...
Run Code Online (Sandbox Code Playgroud)
但是,集合是关系,元素是元组,因此如果关系中的元组不兼容,则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 }
Run Code Online (Sandbox Code Playgroud)
这意味着粒子是原子的类型,而原子是氢的类型.
这样,粒子之间的关系可以高水平表示.
ParticleType(ParticleType,Name)
ParticleTypeHierarchy(ParticleType,ParentType)
ParticleComposition(PartileType,SubParticleType,Quantity)
样本数据:
ParticleType | ParticleType | Name | |--------------+----------| | Particle | Particle | | Proton | Proton | | Neutron | Neutron | | Electron | Electron | | Atom | Atom | | Molecule | Molecule | | H | Hydrogen | | O | Oxygen | | H2O | Water | | O2 | Oxygen | ParticleTypeHierarchy | ParticleType | ParentType | |--------------+------------| | Proton | Particle | | Neutron | Particle | | Electron | Particle | | Atom | Particle | | Molecule | Particle | | Hydrogen | Atom | | Oxygen | Atom | | H2O | Molecule | | O2 | Molecule | ParticleComposition | PartileType | SubParticleType | Quantity | |-------------+-----------------+----------| | H | Proton | 1 | | H | Electron | 1 | | He | Proton | 2 | | He | Neutron | 2 | | He | Electron | 2 | | H2O | H | 2 | | H2O | H | 2 | | H2O | O | 1 | | CO2 | C | 1 | | CO2 | O | 2 |
为了比较,这是子类型表方法的样本数据.
Particle | ParticleId | ParticleName | |------------+----------------| | H | Hydrogen | | He | Helium | | Li | Lithium | | Be | Beryllium | | H2O | Water | | O2 | Oxygen | | CO2 | Carbon Dioxide | Molecule | MoleculeId | some_attribute | |------------+----------------| | H2O | ... | | O2 | ... | | CO2 | ... | Atom | AtomId | ProtonQuantity | NeutronQuantity | ElectronQuantity | |--------+----------------+-----------------+------------------| | H | 1 | 0 | 1 | | He | 2 | 2 | 2 | | Li | 3 | 4 | 3 | | Be | 4 | 5 | 4 | ParticleComposition | ParticleId | ComponentId | Quantity | |------------+-------------+----------| | H2O | H | 2 | | H2O | O | 1 | | CO2 | C | 1 | | CO2 | O | 2 | | O2 | O | 2 |
这些粒子类型由人和人们定义,不断定义新概念以模拟现实的新方面.
我们可以定义"子原子",层次结构将如下所示:

方法4可以更容易地适应这种类型的层次结构变化
好问题,对学习者来说非常周到.我认为你真正追求的是一个讨论,为了获得清晰,这是一个数据建模练习.
我了解你的进展,包括3.3.什么,怎么样,你得到3.4(逐步升级到3.3之后)?对我来说,结合以上所有不等于Generic.
根据您的讨论,让我根据TRD回答相关步骤,而不是跟进您的进展,并为每个步骤建立模型.
TRD只有由Key和Relationships标识的表在这个阶段是相关的,我认为你很清楚属性,如果有的话,以及它们将被部署的密钥.在获得稳定的TRD后,您可以将其扩展为完整的DM.
在建立模型之后,从之前的模型开始,并且在评估之后,如果显然它丢失了信息,则可以安全地丢弃它.有一个值正在考虑这样的模型,所以步骤不正确.但是继续讨论它是一种浪费.我相信我在上一个问题中证明了这一点.
考虑这组表关系图.
从我的角度来看,A First将是第一个值得思考的合理TRD.
我不知道Proton/Neutron/Electron是如何或为何是独立的表.它们不是自己存在的,它们的重量; 等等是固定的.它们仅存在于Atom的上下文中.
由于每个Atom包含至少一个质子/中子/电子,质子/中子/电子列可以部署在Atom中.没画.后来.
你的进展很好,除了一个明显的错误.
关于粒子组成的常见属性在ParticleComposition中,而关于粒子组成的特殊属性在特殊表中.
不.粒子的常见属性在粒子中.特定于关系的属性(即不常见的)属于ParticleComposition.然后没有"关于粒子组成的特殊属性",没有"特殊表格".
考虑B子类型.你的[3.1]大多是正确的,除了:
我不知道粒子是如何拥有像Proton/Neutron/Electron这样的孩子.只有Atom才有.
我没有看到粒子是如何与其他粒子相关的(即那是什么?).对于所讨论的数据,分子由Atoms组成; 原子由质子/中子/电子组成; 粒子是分子x或原子(独有子类型).
如果不正确,请纠正我.
有关该主题的完整详细信息,请参阅子类型文档.
正如你所说,这可以是C Reduced.这就是每个Atom固定Proton/Neutron/Electron信息的概念:每个都有一个条目.例如.每个壳/能级没有区别; 中子可以接受零(而不是空).
如果它完全被D标准化:Atom总是至少有一个Proton条目; Neutron条目是可选的; 每个壳牌/能源水平都有所区别.
注意Predicates中的差异.
请注意,虽然Redu是一种有效的技术,但它并不等同于Normalization.
这似乎是所有内容的总和,平面布局或平面视图(派生关系,透视图,结果集).因此,理解这一点很好.但是如果你把它作为一组表提出,那么由于各种规范化错误,它是非常不正确的.如果纠正,将进展到[3.3]和我的[D标准化].
上述任何设计是否违反了关系模型的规则?
除了[3.3]之外的所有这些都违反了许多规则.大多数情况下,它们属于规范化错误.如果您要提供完整模型或CREATE TABLE语句,则会出现相关的标识错误.
但是,如果上下文是数据建模练习,那么无关紧要.如果这项工作很严重,那么上面的段落就是这样.
本部分按照SO指南进行介绍,具体来说:无论何时看到错误信息,都要正确.我对主题帖做了评论,但它们一直在消失.因此我把它放在这里.
Erwin Smout:
当归结为其本质时,数据的关系模型只有一个"规则":数据库中的所有信息都必须表示为关系中元组中属性的值.
这是规则之一,是的,但附带声明显然是错误的.
首先,关系模型中有许多基本或一阶规则.从记忆中,我会说大概四十岁.
其次,有许多二阶规则,这些规则在逻辑上隐含在一阶规则中.
拥有技术资格和经验,能够理解RM,并遵循精神和意图的人,遵循所有这些.
其他人可能无法识别一些一阶规则或大多数隐含规则.
从书中可以看出有关RM的证据,还有其他人,那些积极颠覆和削弱RM的人.他们忽略了二阶规则,更糟糕的是,他们使用法利赛"逻辑"来破坏一阶规则.
在这里,欧文,谁是众所周知的,他就努力RM上comp.databases.theory和TTM,降低了RM到一个精辟的规则,从而破坏了全套的规则,以及RM本身.特别是回答你的问题,如果不是我的回答,会引导读者相信RM是他所做的:只有一条规则,一切,关系以及非关系,"满足".
在关系模型是免费的,你可以自己读.如果您想要副本,请告诉我.需要注意的是,术语已过时,需要加以解释.
其次,即使将其归结为一个规则(不可能,过于简化)或最重要的规则(可能,但是贬低),该规则也不会如此.这是四十个左右的一阶规则之一,但肯定没有排在顶部.
但是,我允许其他人可能有不同的排名,以满足他们自己的目的.
知道RM的人 确实讨论过,因为RM与其前辈之间的主要区别(不是规则)是:
它是第一个拥有完整数学定义的(它构成了它的基础,并且其中的所有内容都来自于此).
虽然前任使用物理记录ID来记录相关记录,但RM要求(a)由数据组成的逻辑密钥,以及(b)通过这些逻辑密钥关联行(而不是记录).
必须提到的是,这是在每个文件中被称为"主键"的记录ID特征的系统完全非关系的基础,回归到1970年以前的ISAM记录文件系统,该RM变得过时.另请注意,这些原始系统如何显示为"关系",因为通过精神分裂的"逻辑",它们"满足"一个引用的规则.诚实的逻辑破坏了这种无稽之谈.
正是由于错误的信息,这种基于记录ID的系统已经成为行业低端的noram.因此我愿意纠正它.
结束错误信息修正部分.
哪种方法最好?
正式数据建模,包括关系规范化.方法,科学,原理,而不是NF定义的片段.
我不认为这些提议是不同的方法,而是在一个单一的建模练习中列出你所有的想法.而模型开始采取严肃,可行的形状的点是[3.3].
这取决于我们对数据的看法吗?
当然.根据你对妻子的看法,你的婚姻会成功或失败,因为这种看法是你所有行为的所在.根据您对数据的感知,模型将成功或失败.
关系模型的一大优点是它教会我们查看(感知,思考,建模)数据,作为数据,而不是数据.首先,这形成了逻辑键概念.
它取决于要求吗?
第一个答案是,不,它不应该依赖于要求.它应该考虑数据,其范围仅限于企业(要求,是,但不是功能要求),只有数据.
当然,由于我在其他地方详述的原因,数据模型应该与现实世界相匹配,不应该限制数据的功能需求.
OO/ORM模型失败的大错误,常见原因是,它从OO/ORM模型的微小镜头中感知数据.它无法将数据与进程分开,它将数据视为对象的"持久性"从属.该模型中还有许多其他错误,我在此不会列举,重点是,它们从需求的位置开始,并忽略数据.
第二个答案是,在设定要求之前,项目不会受到委托,如果资金是基于需求的,则是现实.因此,成熟的项目负责人确保需求包含足够的理由来分析和建模数据,作为数据,与功能分开.
如果它取决于要求,我们首先应选择最简单的设计,然后使其更通用以适应新的要求吗?
你可以,但这将花费很多.成熟的序列是尽早获得正确的数据模型.
如果数据模型与现实世界匹配,当更改和添加出现时,很容易扩展.相反,如果数据模型是功能需求的最小值,或者它与现实世界不匹配,那么更改将是困难且成本高昂的.
虽然生成的数据模型有许多相似之处,但初始设计可能会影响表/列的命名,并且键的域也不同.
当然.
如果我们选择对每种类型的东西使用一个表,我们可以为Atom和Molecule选择不兼容的键,例如Atom的原子重量和Molecule的分子名称.
那将是一个可怕的错误.切勿将东西放在与标签不匹配的容器中.切勿在一个容器(有一个标签)中放置两个不同的东西.正确的方法是使用公共标识符Name(Atom-或Molecule-或Particle-name),并使用Subtypes.
如果我们选择使用通用方法,我们可以为所有粒子选择公共密钥.
只有有一个.如果没有,那表示实体不相同,则不能使用通用模型.
更改密钥可能会对系统产生更大的影响,因此从简单设计演变为通用设计可能并不容易.
好吧,我们的想法是选择稳定(非静态)的数据项来形成密钥.是的,关键设计是建模练习的一个重要方面.如果遵循关系模型,则键构成数据库的逻辑结构.域非常重要(我想你意识到了这一点).是的,改变成本很高.
这让我们回到了主要观点.这正是必须为每个表及其所有子表正确建模和选择键的原因.
我刚刚注意到你的两个更新.这不是一个完整的回应,现在只是一个很短的回应.
但是现在,鉴于你的层次结构图和样本数据(谢谢),我意识到我认为你的意思和你的意思是两回事.考虑更新的TRD和层次结构:
你的粒子是一组分子加上一组原子加上一组亚原子粒子.
那是不对的
有一个层次结构,是的,但到目前为止,它存在于表的序列中,而不是作为一个表中的层次结构.
换句话说,两组(原子,分子)是离散的,每组都有它们自己的一组组件,它们是不同的.没有包含所有内容的集合(理论通用集除外).
更新的表关系模型为E规范化•更新2.子类型已与粒子一起被删除.它提供了Update 2中所述的所有要求.请注意更新的Predicates.
您的层次结构图不正确.
您的错误是,您已将分类器(结构,容器)的层次结构与数据(分类器的实例;内容)相结合.你不能这样做.您需要两个单独的图表,一个用于容器,另一个用于内容.
这是OO/ORM思维模式的典型错误.未遵守科学原则将数据与过程分开.在上一个问题中我对Hidders的回复中详述的完全相同的错误.结果是复杂的对象,从来没有真正起作用.
因此,您的层次结构图是非法的,它是两个完全不同的图组合成一个.
F层次结构(分类)描述了这一点,而且只是那个.
G层次结构(示例数据)说明了这一点.
您描绘层次结构的方式(组织结构图)与我描述层次结构的方式(资源管理器)之间存在差异.一个最终非常宽,另一个更紧凑.我想你可以搞清楚
在上一个问题的结尾处你有一些清晰度.的新概念,类型在有毒的书已经得到了你完全糊涂了.这个问题,这些问题与Type无关.
需要更多的话,我会在时间允许的情况下更充分地回应.