我必须维持旧的数据库,这是不正确地归一化。例如有一个项目表,增长(或者如雨后春笋)有5个或更多不同的日期列为不同的里程碑的项目正在有序的交货日期。还有几个表中的每一个列街道地址、邮件或网站链接。

我想正常化的结构,创建表地址、预定的日期等,并在必要表以允许为1:N关系(地址每个客户,到期日期,每项目等等)。

现在我完全不清楚如何处理变化中的数据明细表。考虑到例如改变的客户交货的地址。变化的数据在该地址表出的问题,因为多于一个记录(可能在多个表)可以参考这一记录。增加一个新的地址记录可以离开旧记录成为孤儿如果没有其他行一外国的关键关系。

我已经想到有关以下方式来处理这个:

  • 添加一个新的详细记录,并检查在更新触发的主表是否老详细记录已经被删除。这将需要的知识有关的所有表有关系的详细表,在他们所有人,或在一个sproc.我不喜欢这种损失的分离。它还将涉及多个表在活动的交易。

  • 让触发试图删除旧的详细记录,并发现任何错误。这只是感觉是错误的。

  • 生活在孤立的记录,并必须定期维护任务清理的所有详细表。

什么是首选的方式来处理数据更改的详细表格,链接到几个主表?任何提示读了这个吗?

有帮助吗?

解决方案

一部分问题可能是原始模式的设计:外键点错误的方式,处理地址、电话号码等。作为主,而不是详细说明。这可能是方便的时候你希望所有使用的一个指定的地址更新一次,但以我的经验,它始终是移交到太多困难的特殊情况下,例如一个人在位置移动,所以你需要打破他们的链接vs整个家庭或办公室的运动,所以你更新现有记录。如果你试图隐瞒这个细节从上的用户。屏幕上,你最终会有一种情况,它就不会做你想要什么。

如果它这样做只是为了崩溃重复的价值观,这是一个有效的非正规化的数据库:仅仅存在的地址的行为毫无意义的。唯一的区别是,与大多数denormalizations,它试图获得空间的效率而不是速度。创建一个链接表在这一点只是加剧了这一问题。

如果你想要的,例如,多个地址联系,使地址的详细表与外国的关键指向回到父母的接触,并且不用担心重复的地址值,因为 他们只是值.否则,使地址一个真正的实体:增加一个标题或说明的领域和增删改屏幕,使它能够立足于其自身作为一个实体。

其他提示

生活在孤立的记录,并必须定期维护任务清理的所有详细表。

我认为你是模糊的删除和更新情况。

如果你有客户和客户b,二者都使用相同的地址,这将反映通过记录在一个关系表(说ClientAddresses,虽然如果是储存地址多个实体,我相信这将是比这更复杂)

我会认为如果两个客户分享和地址,这是不正确的,对客户就将是不正确的客户b以及(即数据输入错误),但是如果你确定你不想客户有改变成基地址的信息,除该协会的记录(删除从ClientAddresses),并添加一个新的地址。当你执行删除的关系表(据推测从一个存储程序)的检查,看看是否有任何其他记录参照的地址记录被取消关联,如果不删除从基座。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top