【发布时间】:2014-05-02 19:12:42
【问题描述】:
我们正在创建一个包含多个将使用邮寄地址的实体的数据库。其中一些实体可以有多个地址,而其他实体只能有一个地址。我们决定将地址集中在一个名为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 表,但在上面进行了更正。它实际上是一个“扩展”表,允许邮寄地址与一方相关。基本上,一个Party可以有多个地址,但在目前的设计中,地址只能属于一个Party。这是否改为多对多关系取决于我原来的问题的答案。
是的,邮寄地址可以更新。信和党之间实际上没有任何关系。我应该解释说它们被系统的两个不同功能使用。该系统中有许多实体需要为其分配地址。为了说明的目的,我在这里包括了两个(信和聚会)。还有更多,但不同实体具有相同地址这一事实并不能使它们在该系统中具有逻辑关联。
【问题讨论】:
标签: database-design relational-database street-address