基于我在此处发现的讨论: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
那么,假设满足以下要求,你如何对此进行攻击:
频道可能会随时间而变化。这意味着:他们的描述可能会改变。可以添加新的,仅从某些特定数据开始有效。频道可能会失效(在某个特定日期)
出于报告和监控的目的,可能需要确定最初提交请求的渠道。
对于新请求,只允许当前“有效”的频道,而对于预先存在的频道,也应允许在该特定日期有效的频道。
根据我的理解,这显然要求更丰富的失效方法超越删除标记,可能是对参考数据表采用'ValidFrom / ValidTo'方法的东西。
另一方面,这在请求的数据捕获期间涉及若干困难,因为对于新请求,您仅显示它们当前可用的通道,而对于预先存在的通道的维护,在创建该记录时可用的所有通道需要显示。从开发的角度来看,这可能不仅复杂,而且对用户来说可能也不直观。
您如何为可能随时间推移的参考数据设置数据模型?那你如何创建用户界面呢?您为正确的数据库设计考虑了哪些其他参数?
答案 0 :(得分:1)
在这种情况下,我通常会创建另一个表格,例如,channel_versions
复制channel
中的所有字段,并且具有额外的create_date
列(当然它也是自己的PK)。对于channel
我在插入/更新触发器后定义,将新值复制到channel_versions
。现在,来自Request
表的所有请求都引用channel_versions
的记录。对于新请求,您需要从channel_versions
获取最新版本的频道。对于旧请求,您始终知道在完成请求时通道的外观。