Database design 如何防止规范化数据库明细表中的孤立记录?

Database design 如何防止规范化数据库明细表中的孤立记录?,database-design,normalizing,Database Design,Normalizing,我必须维护一个未正确规范化的旧数据库。例如,对于项目从订购到交付日期的不同里程碑,有一个项目表已经增长或可能迅速增长,有5个或更多不同的日期列。还有几个表,每个表都有用于街道地址、邮件地址或web链接的列 我想规范化结构,为地址、计划日期等创建表,并创建必要的表,以允许每个客户的1:N关系地址、每个项目的截止日期等等 现在我完全不确定如何处理对细节表中数据的更改。例如,考虑客户交付地址的变更。更改地址表中的数据是不可能的,因为多个表中可能有多个记录可以引用该记录。如果没有其他行与旧记录有外键关系

我必须维护一个未正确规范化的旧数据库。例如,对于项目从订购到交付日期的不同里程碑,有一个项目表已经增长或可能迅速增长,有5个或更多不同的日期列。还有几个表,每个表都有用于街道地址、邮件地址或web链接的列

我想规范化结构,为地址、计划日期等创建表,并创建必要的表,以允许每个客户的1:N关系地址、每个项目的截止日期等等

现在我完全不确定如何处理对细节表中数据的更改。例如,考虑客户交付地址的变更。更改地址表中的数据是不可能的,因为多个表中可能有多个记录可以引用该记录。如果没有其他行与旧记录有外键关系,则添加新地址记录可能会使旧记录成为孤立记录

我考虑过以下处理方法:

添加新的详细记录,并在主表的更新触发器中检查是否必须删除旧的详细记录。这需要了解所有表中或存储过程中与细节表相关的所有表。我不喜欢失去分离。它还将在活动事务中涉及更多的表

让触发器尝试删除旧的详细信息记录,并捕获任何错误。这感觉不对


使用孤立记录,并执行定期维护任务来清理所有详细信息表


处理链接到多个主表的明细表中的数据更改的首选方法是什么?阅读此项的任何提示?

使用孤立记录,并定期执行维护任务清理所有细节表。

使用孤立记录,并定期执行维护任务清理所有细节表。

部分问题可能是原始模式设计:外键指向错误的方向,将地址、电话号码等视为主要信息,而不是详细信息。当您希望同时更新给定地址的所有用途时,这可能很方便,但根据我的经验,它总是会演变为太多困难的例外情况,例如某个位置的一个人移动,因此您需要断开他们与整个家庭或办公室移动的链接,以便更新现有记录。如果您试图在CRUD屏幕上对用户隐藏此详细信息,那么最终会出现这样一种情况,即它无法满足您的需要

如果这样做只是为了折叠重复的值,那么实际上是数据库的非规范化:仅仅存在地址行是没有意义的。唯一的区别是,与大多数非规范化不同,它试图获得空间效率而不是速度。在这一点上创建链接表只会使问题更加复杂


例如,如果您希望每个联系人有多个地址,请将地址设置为一个详细信息表,外键指向父联系人,并且不必担心重复的地址值,因为它们只是值。否则,将Address设置为真实实体:添加标题或描述字段和CRUD屏幕,使其能够作为实体独立存在。

问题的一部分可能是原始架构设计:外键指向错误的方向,将地址、电话号码等视为主项而不是详细项。当您希望同时更新给定地址的所有用途时,这可能很方便,但根据我的经验,它总是会演变为太多困难的例外情况,例如某个位置的一个人移动,因此您需要断开他们与整个家庭或办公室移动的链接,以便更新现有记录。如果您试图在CRUD屏幕上对用户隐藏此详细信息,那么最终会出现这样一种情况,即它无法满足您的需要

如果这样做只是为了折叠重复的值,那么实际上是数据库的非规范化:仅仅存在地址行是没有意义的。唯一的区别是,与大多数非规范化不同,它试图获得空间效率而不是速度。在这一点上创建链接表只会使问题更加复杂


例如,如果您希望每个联系人有多个地址,请将地址设置为一个详细信息表,外键指向父联系人,并且不必担心重复的地址值,因为它们只是值。否则,将Address设置为真实的实体:添加标题或描述字段和CRUD屏幕,使其能够作为实体独立存在。

我认为您正在模糊删除和更新案例

如果您有客户机a和客户机b,并且两者都使用相同的地址,那么这将通过关系表中的记录反映出来,例如ClientAddress,尽管您存储的地址是用于multip le entities,我相信它会比这更复杂


我认为,如果两个客户端共享和地址,并且客户端a不正确,客户端b也不正确,ie数据输入错误,但如果您确定不希望客户端a更改基址信息,请从客户端地址中删除关联记录并添加新地址。当您执行从关系表中删除(可能是从存储过程中删除)时,请检查是否有任何其他记录引用正在解除关联的地址记录(如果没有从基表中删除)

我认为您正在模糊删除和更新案例

如果您有客户机a和客户机b,并且两者都使用相同的地址,这将通过关系表中的记录反映出来,例如ClientAddress,尽管如果您存储多个实体的地址,我相信这将比这更复杂


我认为,如果两个客户端共享和地址,并且客户端a不正确,客户端b也不正确,ie数据输入错误,但如果您确定不希望客户端a更改基址信息,请从客户端地址中删除关联记录并添加新地址。当您执行从关系表中删除(可能是从存储过程中删除)时,请检查是否有任何其他记录引用正在解除关联的地址记录(如果没有从基表中删除)

假设输入了一个新客户,该客户与另一个客户共享地址,甚至与另一个也有地址条目的实体共享地址。我关心的是这样一种情况,即只有一个地址后来发生了变化,即客户搬迁了。两个地址都是正确的,但不再相等。在重新定位的情况下,我们删除旧地址,然后添加新地址。SO 1从关系表中删除,如果没有其他关系,我们也从基表中删除一个插入到基表,一个插入到关系表。考虑一个新的客户,他与另一个客户共享地址,甚至一个不同的实体也有地址条目。我关心的是这样一种情况,即只有一个地址后来发生了变化,即客户搬迁了。两个地址都是正确的,但不再相等。在重新定位的情况下,我们删除旧地址,然后添加新地址。因此,如果没有其他关系,则从关系表中删除1。我们也从基表中删除一个插入到基表,一个插入到关系表。原始模式设计没有外键,我想在此方向修改模式。我将不得不考虑你的答案,看起来关于键指向错误方向的观点可能会有所帮助。经过一些思考后,我同意你的最后一段——但它们只是价值观的真正含义是什么?这不是完全忽略了规范化规则吗?我不喜欢表格中有很多行,只有PK和fk不同,其他所有字段都相同。从某种意义上说,这就像担心图像中有那么多像素具有相同的颜色值,它们只因坐标不同而不同。您可能希望使用某种压缩-空间优化-用于传输或存储目的,但压缩图像文件不利于有效读取和写入单个任意像素。原始模式设计没有外键,我希望在此方向修改模式。我将不得不考虑你的答案,看起来关于键指向错误方向的观点可能会有所帮助。经过一些思考后,我同意你的最后一段——但它们只是价值观的真正含义是什么?这不是完全忽略了规范化规则吗?我不喜欢表格中有很多行,只有PK和fk不同,其他所有字段都相同。从某种意义上说,这就像担心图像中有那么多像素具有相同的颜色值,它们只因坐标不同而不同。您可能希望使用某种压缩—空间优化—用于传输或存储目的,但压缩图像文件不利于高效读取和写入单个任意像素。