寻找找出建模以下需求的正确方法。
这只是一个较大想法的一小部分,但在扩展模型时却造成了混乱。我认为它必须是图2或其他选项,因为我看不到BandMember如何与第一个模型中的Band关联。
感谢您的投入。
最佳答案
警告
Parties
(子类型)与其他实体之间的关系,因此无法提供完全正确的答案(不会改变)。由于您要分两批提供数据,因此答案将分两批提供,而第二批将需要更改第一个模型。不用抱怨,只是事先给您建议,因为如果我先查看所有数据,就可以避免这种情况。
。
建模数据
这是Ken Downs和Chris Behrens将建模的简单性(高度可扩展)与未建模的实现(不正确且不可扩展)相混淆的原因,这是由于矮人(例如Martin Fowler)建议的简化方法。我知道人们依附并会捍卫他们所知道的一切,但无论有多有限,都不会构成犯罪。
Party
,然后使用子类型或角色的含义,并且丢失了正确的引用完整性。 Party
派生,但这不是使用Party
而不是正确的Role的有效理由。 BandMember
和Fan
不是Parties
。它们是Persons
,第一个(而Person
是Party
,第二个)障碍
在介绍模型之前,请先指出这些问题,因为您似乎对学习IDEF1X(对关系数据库建模的标准方法)非常感兴趣,以期将来简化模型。因此,SO或任何网站都不是进行正式的交互式教育的理想工具,但我们会尽力而为。
Band
不能独立(方角):因为它被标识为依赖Party
;它是Party
的子类型;并且具有相同的标识符Band
由一对多Members
组成。等等。。
尽管编程可以逐步进行(一旦定义稳定),但是建模则不能。例如。您不能为实体建模,而不能为关系建模;关系而不是基数。这就是为什么它们是一门不同的科学,程序员没有成为好的建模者的原因,反之亦然。
。
Person
根本不存在,则它们是公众的成员,并且与Band
没有任何关系。普通的Person
。 Fan
与至少一个Band
有关系。实际上,与Band
有关系就是将Person
移出该领域并导致存储Fan
详细信息或特定的频带扇形详细信息的原因。 Fan with no Band
这样的实体(即,您要存储其详细信息,根据我的模型与Fan
分开存储),请提出建议,我将更改模型(纸张很便宜!)。 如 IDEF1X表示法文档中所述,对于关联表,将“动词短语”“直通”通过它们读到关联另一侧的父级。
Person
是一对多的Bands
,因此是Member
Band
由一对多People
组成,它们是Members
Person
支持Band
,这使它们成为Fan
(不仅仅是在Person
表中有一行的Fan
)Band
取决于People
,谁是Fans
提出最短,最有意义的动词短语;不使用简单的单词(避免使用“包含”)对建模人员来说是一个挑战。请随意改善我提供的动词短语。
▶Party Entity Relation◀
不熟悉关系数据库建模标准的读者可能会发现
▶IDEF1X Notation◀有用。
注意
我所做的就是解决子类型;角色;如上所述的关系基数。
Person
和Band
是Party
的子类型。它们也是Party
的角色。因此,我们从该点开始向下使用PersonId
和BandId
,而不是PartyId
(即使它是PartyId
)。 Person
扮演Member
的角色时,我们使用MemberId
(即PersonId
,即PartyId
)。 Person
扮演Fan
的角色时,我们使用FanId
(即PersonId
,即PartyId
)。 假设您要列出
Fans
的Band
,而查询以Fan
为中心。如果在每个表上都有这些Id
代理键,则将被迫加入Person
,然后加入Party
。但是,有了关系标识符,您可以直接转到Party
:SELECT Name FROM Party WHERE PartyId = FanId
并跳过中间的表格。是的,事实是,规范化关系数据库需要更少的联接,更少的资源(处理,缓存,磁盘I / O),这就是它们表现出如此出色的原因之一。神话没有科学依据。
请评估并提出具体问题。
关于database - 数据建模:父类(super class)型/子类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4763141/