Ste*_*ieD 5 database-design subtypes
我正在竞选公职,并创建了一个网络应用程序,用于跟踪我在家中向选民敲门的情况。该数据库包含一个名为的表voters,其中包含有关我社区中选民的所有必要信息。我正在使用 mysql。
我想添加一个新功能来跟踪我的竞选活动的捐助者。并非所有这些捐助者都住在社区,也不在我竞选公职的地区投票。我不需要为这些人跟踪与我为选民所做的相同类型的信息,因此我将这些人放入一个名为的表中nonvoters.
现在,我voters表中的个人也可以进行捐赠,我也想跟踪这些人。
最后,我还想跟踪组织的捐赠,因此我还需要一个organizations表来存储有关组织的信息。
为了跟踪来自选民、非选民和组织的捐赠,我想建立一个名为donations.该表的新表,该表将包含有关每笔捐赠的适当详细信息。
但我不确定其最好的结构是什么样的连接donations表的voters,nonvoters和organizations表应该是。如果我donor_id在表中创建一个名为的列以将其键入捐赠者信息,则无法知道该 ID 指的是哪个表。那么我是否设置三列,nonvoter_id,voter_id和org_id并根据捐赠者是否是选民将 ID 插入适用的列中?这看起来很奇怪。
或者,我可能会在三个表中的每一个中创建一个新列,称为donor_id我可以用来将我的数据链接到捐赠表。如果我走这条路,似乎我必须做一些幕后工作,以确保donor_id 是唯一的,并且与捐赠表中的数据相关联。
或者也许还有其他我不熟悉的方法。任何指导表示赞赏。
好问题,您提供了非常引人入胜的背景和分析。
\n\n根据我对您的场景描述的理解,一些重要方面可以通过(超级)类型-子类型关系来处理。对此,这篇文章提供了相关信息。
\n\n根据您当前的规范,以下断言似乎有效:
\n\nParty1 ]是a或Person 。OrganizationParty授予零个或多个 Donations。Person可以是 aVoter和 a NonVoter。因此,我导出了图 1所示的IDEF1X [2]逻辑数据模型。
\n\n
聚会及捐赠
\n\n正如您所看到的,将实体合并Party为独占超类型Person提供了 a或 anOrganization能够授予 的可能性Donations,因为PartyId属性从[3]迁移到,但我已经分配了一个角色名称[4](即,)这样的属性,以便使其在实体的上下文中更有意义。PartyDonationDonorIdDonation
个人与组织
\n\n以同样的方式,PartyId迁移到PersonasPersonId和Organizationas OrganizationId,这两个实体依次可以保留其特定属性。
选民和非选民
\n\n我认为,在您的业务环境中,给定Person可以是 aVoter和 aNonVoter随着时间的推移,具体取决于District所说Person所在的具体情况,因此我暂时在非排他超类型集群中描述了这种情况,但我认为我们需要澄清这方面的一些要点。
这一数据建模练习的目标是捕获与您的业务环境要求相关的感兴趣的事物,并且可以通过确定所涉及的实体及其各自的属性(包括,特别注意的是,唯一标识的实体)来实现这一目的。每个实体的出现)以及这些实体相互连接的方式。通过这种方式,所述方面对您和您的数据用户所具有的语义价值至关重要。这些因素理解得越好,就越能在数据模型中更好地描述它们。
\n\n话虽如此,我又创建了三个模型(也是初步的),以便有一个工具来举例说明有关您的场景的一些想法。它们包含在此 PDF 中,您可以从 Dropbox 下载该 PDF。
\n\n那么,需要澄清的具体方面如下:
\n\nDoorKnock?Person可以接收\xe2\x80\x94的状态Voter或NonVoter在 \xe2\x80\x94 的上下文中,如上所述 \xe2\x80\x94 ( a)District其所在的Person位置和 (b)确定的Election实例。你怎么看待这件事?\n\nPerson?Voter?NonVoter?\n\nPerson。Donation授予a ,这是正确的吗?\n\ nElectionDonations授予的Organizations,(a)居住在您所在选区以外的组织是否允许捐款,或者(b)是否仅允许位于您所在特定选区的组织进行捐赠?\n\nOrganizations,则有必要将DistrictPK 从Person移至Party。我认为,实际上,这可能是该属性的正确位置,但请让我知道您对此的想法。我已在模型 C中说明了此选项。Donations每人允许多少Party?(a)一个,(b) 固定数量,还是(c)未定义数量?\n\nMinimumAmount和(b) a是否有相关限制?MaximumAmountDonationMinimumAmount和(b) a相关的限制?MaximumAmountDonationsPartyElection?\n\nDistrict事件?\n\nDistrictNumber在所有模型中用于此目的,但它很可能是不同的属性。\n\n\n我从未听说过数据库中的类型-子类型关系。这很有趣。
\n
是的 \xe2\x80\x94 据我所知 \xe2\x80\x94类型-子类型关系是在1979 年的关系范式中引入的[5],不幸的是,它们在常见实现中并未广泛使用。但既然我们知道了它们,我们就可以在您的场景中利用这个有趣且强大的结构。
\n\n\n\n\n我不太熟悉数据库,所以不确定如何开始实现所需的列。我的所有操作
\nINSERTS都是简单的单表插入,看起来这种方法需要一些更高级的查询。不过,我绝对愿意学习。
不用担心,您熟悉其他计算机科学分支但不太熟悉关系数据库是完全可以理解的,我认为这是您更多地了解这个令人着迷的学科的好机会,我们都都会学到新东西天。
\n\n是的,在数据库表中插入一行(或一组行)意味着与用编程语言创建记录或文件不同的考虑因素。
\n\n我们首先需要集中精力获得稳定的逻辑数据模型,然后我们将轻松导出物理模型(DDL语句或\xe2\x80\x9cCREATE表代码\xe2\x80\x9d)。一旦我们定义了明确的目标(所有上述目标),我将很乐意提供一些与您的 INSERT 实施和其他相关元素相关的想法和指导。
\n\n1.当事人是法律语境中使用的一个术语,指组成单个实体的个人或团体。
\n\n2.信息建模集成定义(IDEF1X)是一种非常值得推荐的数据建模技术,由美国国家标准与技术研究所(NIST )于1993年12月定义为标准。
\n\n3、IDEF1X将键迁移定义为\xe2\x80\x9c将父或通用实体(或超类型)的主键作为外键放置在其子或类别实体(或子类型)中的建模过程\xe2\x80\x9d 。
\n\n4.自 1970 年起,EF Codd 博士在其题为\xe2\x80\x9cA 大型共享数据库数据关系模型\xe2\x80\x9d 的开创性论文中就建议使用角色名称。就其本身而言,IDEF1X \xe2\x80\x94 保持关系实践的保真度\xe2\x80\x94 还提倡角色命名。
\n\n5. Codd 博士(正如人们所期望的那样)在其题为\xe2\x80\x9cExtending the Database Relational Model to Capture More Meaning\xe2\x80\x9d 的著作中。
\n