我们正在创建一个包含多个将使用邮件地址的实体的数据库。其中一些实体可以有多个地址,而其他实体只能有一个地址。我们决定将地址集中在一个名为MailingAddress
的表中。示例布局如下所示。
Party PartyAddresses MailingAddress Letter
_____ ______________ ______________ ______
PartyID (PK) PartyID (FK) MailingAddressID (PK) LetterID (PK)
PartyName MailingAddressID (PK,FK) StreetAddress From
City To
State Subject
ZipCode MailingAddressID (FK)
我们在是否仅允许MailingAddress表中的唯一地址方面存在争议。例如,如果某方的地址为123 Main St, Anywhere, NY
且地址的地址为123 Main St, Anywhere, NY
,则123 Main St, Anywhere, NY
只有一个地址记录。
一个论点是,只有一次给定地址会减少地址记录的数量,并且更好地形成"形式"。基本上,改进了存储和表格大小。
另一个论点是,虽然论证一在理论上是合理的,但这种方法的实际弊端超过了利益。首先,必须围绕唯一性编码的性能损失。例如,要么处理INSERT上的唯一约束违例并查询现有记录,要么查询现有记录并在未找到时插入新记录。此外,如果更新记录,则需要重复此过程,因为如果现有地址被另一个实体使用,则需要保留现有地址。其次,不得不编写此代码的风险增加。它增加了引入错误的可能性,即更新和另一个实体使用的现有地址。
根据您的经验,哪个更好?这与标准化有什么关系?
编辑:
实际上,我歪曲了PartyAddresses表,但已在上面更正过。它实际上是指"扩展"表允许邮寄地址与一方相关。基本上,一方可以有多个地址,但在当前的设计中,地址只能属于一方。这是否改为多对多关系取决于我原来问题的答案。
是的,邮寄地址可以更新。信和党之间实际上没有任何关系。我应该解释它们被系统的两个不同特征使用。该系统中有许多实体需要分配地址。我在这里包括两个用于说明目的(信和党)。还有更多,但不同实体具有相同地址的事实并不会使它们在此系统中具有逻辑相关性。
答案 0 :(得分:0)
设计应反映您要开发的应用程序的需求。我需要澄清一些信息:
我在您的设计中看到Party - MailingAddress具有多对多关系:一方可以拥有多个地址,多方可以拥有相同的邮寄地址。这是你期望发生的吗?
当你想收到一封信时,你是否关心那封信所涉及的一方?如果您按照描述设计数据库,我们无法知道信中涉及哪一方。
邮寄地址可以更新吗?或者您只在创建具有新地址的新方或现有方更改其地址时插入新的一方,并在删除具有该地址的最后一方时删除一方?如果您计划有时更新邮寄地址,当您查询旧信件时,收到的地址信息也会更改。