Database design 强制使用唯一地址还是允许重复?

Database design 强制使用唯一地址还是允许重复?,database-design,relational-database,street-address,Database Design,Relational Database,Street Address,我们正在创建一个包含多个实体的数据库,这些实体将使用邮寄地址。其中一些实体可以有多个地址,而其他实体只能有一个地址。我们决定将地址集中在一个名为MailingAddress的表中。下面显示了一个布局示例 Party PartyAddresses MailingAddress Letter _____ ______________ ______________ ______ PartyID

我们正在创建一个包含多个实体的数据库,这些实体将使用邮寄地址。其中一些实体可以有多个地址,而其他实体只能有一个地址。我们决定将地址集中在一个名为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号,而一封信的地址为纽约州主街123号,则只有纽约州主街123号的一条地址记录

一个论点是,任何给定的地址只有一次会减少地址记录的数量,并且是更好的形式。基本上,改进了存储和表大小

另一个论点是,尽管第一个论点在理论上是正确的,但这种方法的实际失败却超过了它的好处。首先,必须围绕唯一性编码的性能损失。例如,在插入和查询现有记录时处理唯一约束冲突,或者在未找到记录时查询现有记录并插入新记录。此外,如果更新了记录,则需要重复此过程,因为现有地址需要保持不变,以防被其他实体使用。其次,必须编写此代码的风险增加。它增加了引入错误的可能性,该错误会更新其他实体使用的现有地址

根据你的经验,哪一个更好?这与规范化有什么关系

编辑:

事实上,我歪曲了PartyAddresss表,但已在上面更正了它。它实际上是一个扩展表,允许邮件地址与一方相关。基本上,一方可以有多个地址,但在当前的设计中,地址只能属于一方。这是否会变成多对多关系取决于我最初问题的答案


是的,邮寄地址可以更新。实际上,信件和当事人之间没有任何关系。我应该解释一下,它们被系统的两个不同功能所使用。该系统中有许多实体需要为其分配地址。为了便于说明,我在这里包括了两封信和一方信。还有更多,但不同实体具有相同地址这一事实并不意味着它们在本系统中具有逻辑关联。

设计应反映您将要开发的应用程序的需求。我需要澄清的一些信息:

我在您的设计中看到,Party-MailingAddress具有多对多关系:一个Party可以有多个地址,多个Party可以有相同的邮寄地址。这就是你所期望的吗

当你想收到一封信时,你是否关心那封信中涉及的当事人?如果您按照所述设计数据库,我们无法知道该信函涉及哪一方


可以更新邮寄地址吗?或者,您仅在创建具有新地址的新参与方或现有参与方更改其地址时插入一个新的参与方,而在删除具有该地址的最后一个参与方时删除一个?如果您计划有时更新邮寄地址,当您查询旧信件时,收到的地址信息也会更改。

请参阅上面的我的编辑。你的最后一句话是我想表达的观点之一。我赞成第二个论点,允许重复地址。我认为在插入新地址之前检查现有地址所涉及的开销,以及处理更新地址所需的特殊编码,超过了使用更干净数据的好处。