数据的变化及其对历史数据的影响

时间:2011-11-12 17:07:17

标签: relational-database crm

假设您拥有一个包含客户和订单的简单CRM系统。如果客户更改了他的名字,您是否希望旧历史订单也获得新名称,或者您是否将其复制到订单上的字符串值以保持准确性?

我怀疑有一个涵盖所有情况的答案,但我正在努力决定在哪里可以接受要更改的历史数据以及我无法接受的地方。一般来说,我认为如果可以打印,它必须在以后再次打印,因此不应该改变。

很高兴听到你的想法......

(如果此问题属于其他地方,请指明方向......)

1 个答案:

答案 0 :(得分:2)

您不能允许更改此类历史数据,尤其是有朝一日可能需要打印并转交法院的内容。

  

一般来说,我使用的想法是,如果可以打印,那一定是   可以在以后再打印,因此不应该改变。

这不是一个糟糕的开始。但是一些印刷品预计会随着时间而改变。电话簿,十字交叉目录,账单地址。您希望允许包含“当前帐单邮寄地址”的列更改,但您不希望更改包含“订单时的帐单邮寄地址”的列。您希望“当前价格”随时间变化,但“订单时的价格”不应随时间而变化。

简而言之,在决定是否对其进行级联更新之前,您需要知道每个列的含义。

如果您允许“订单时的价格”随着时间的推移而改变,您将随着时间的推移更改订单总数 - 我确信您的会计师会对此感到满意。

有多种方法可以防止更改历史数据。

  • 不要使用级联更新或删除的外键引用。 这几乎总是一个要求。是否可以使用外键引用取决于应用程序。
  • 让用户界面填写诸如“账单地址”之类的内容 订单的时间“,可能是通过从客户账单地址表中选择和复制。这不会重复数据,也不会在关系意义上重复。重复数据表示”具有相同的值当您将当前帐单邮寄地址复制到“订单时的帐单邮寄地址”列时,您正在更改其含义。
  • 源表的时间戳。一张“客户账单表” 地址“例如,也可能包含表示的列 “将此帐单邮寄地址用于此日期或之后的订单”(a 开始日期)和“使用此帐单地址订购之前的订单 这个日期“(结束日期)。您将加入此表的订单;日期 该订单将确定在该时间使用哪一行 订单(例如,...JOIN customer_billing_addresses c ON c.start_date <= orders.order_date AND orders.order_date < c.end_date...)。 您需要仔细设计以确保没有重叠 句点,并严格控制从客户帐单地址删除行。 (也就是说,几乎完全禁止。)

无论采用何种方法,都要认真考虑谁应该有权更改历史表中的数据。一旦订单发货,这意味着几乎没有人。