参考数据的删除/失效方法

时间:2011-03-20 15:05:30

标签: database database-design static-data

基于我在此处发现的讨论:Database: To delete or not to delete records,我想特别关注参考数据,添加一些想法,并一般地询问您的首选方法,或根据您制定的标准决定采用哪种方法。

让我们假设客户的“请求数据库”有以下数据结构,而请求可以通过各种渠道(电话,邮件,传真,......;我想要主要关注的'参考数据表')传递:

Request (ID, Text, Channel_ID)
Channel(ID, Description)

我们首先假设这两个表中包含以下数据:

请求:

ID    | Text                                         | Channel_ID
===============================================================  
1     | How much is product A currently?             | 1 
2     | What about my inquiry from 2011/02/13?       | 1
3     | Did you receive my payment from 2011/03/04?  | 2

频道:

ID    | Description
===============================================================  
1     | Phone
2     | Mail
3     | Fax

那么,假设满足以下要求,你如何对此进行攻击:

  1. 频道可能会随时间而变化。这意味着:他们的描述可能会改变。可以添加新的,仅从某些特定数据开始有效。频道可能会失效(在某个特定日期)

  2. 出于报告和监控的目的,可能需要确定最初提交请求的渠道。

  3. 对于新请求,只允许当前“有效”的频道,而对于预先存在的频道,也应允许在该特定日期有效的频道。

  4. 根据我的理解,这显然要求更丰富的失效方法超越删除标记,可能是对参考数据表采用'ValidFrom / ValidTo'方法的东西。

    另一方面,这在请求的数据捕获期间涉及若干困难,因为对于新请求,您仅显示它们当前可用的通道,而对于预先存在的通道的维护,在创建该记录时可用的所有通道需要显示。从开发的角度来看,这可能不仅复杂,而且对用户来说可能也不直观。

    您如何为可能随时间推移的参考数据设置数据模型?那你如何创建用户界面呢?您为正确的数据库设计考虑了哪些其他参数?

1 个答案:

答案 0 :(得分:1)

在这种情况下,我通常会创建另一个表格,例如,channel_versions复制channel中的所有字段,并且具有额外的create_date列(当然它也是自己的PK)。对于channel我在插入/更新触发器后定义,将新值复制到channel_versions。现在,来自Request表的所有请求都引用channel_versions的记录。对于新请求,您需要从channel_versions获取最新版本的频道。对于旧请求,您始终知道在完成请求时通道的外观。