我正在编写一个包含以下表格的应用程序:(1) employee_type,(2) employee和(3) employee_action。
Employee_action是employee的外键,它包含对发生的事情和事件日期的描述,正如您所预期的那样。
但是,随着时间的推移,员工可以改变他们的类型(升职、降职、搬迁等)。如果我的模式就是这么简单,那么您可能会生成一份历史报告,其中说John在10年前送披萨的时候是该公司的首席执行官。
对于我来说,最好的方式是保存这样一个事实,即员工在执行操作时具有一定的特征集,而这些特征在当前不一定是他们的特征?
我在这里简单地说明我的问题。我有比3多得多的表格,员工的位置并不是我唯一担心的特征。对于我来说,不能仅仅将所有内容都反规范化,然后创建一个包含每个可能的employee字段的历史表。
谢谢,我希望这是清楚的。
发布于 2008-09-30 07:41:02
为了回答你的问题,我认为你唯一的选择(如果你不能对模式做任何重新设计)是添加一个表,在其中存储某个特定条件成立的时间跨度,例如,一个包含员工的表employment_history,一个职位(‘首席执行官’,‘送货男孩’,或者这些职位的ID,如果你将它们标准化到一个表中)和一个开始字段-以及一个用于员工拥有该职位的结束日期的字段。这样,你就可以加入employment_history表,获得人们目前拥有的职位。当然,如果你需要存储更多的‘属性’而不仅仅是位置,这将是一个指数级增长的PITA。阅读上面的书,了解更多讨论:)
发布于 2008-09-30 07:36:54
在SQL中表示时间数据很棘手。有一本关于这个主题的非常好的书,甚至可以从作者那里在线免费获得:http://www.cs.arizona.edu/people/rts/tdbbook.pdf。
亚马逊的网页在http://www.amazon.com/Developing-Time-Oriented-Database-Applications-Management/dp/1558604367上,但已经绝版了。
如果您对SQL中的建模随时间变化很认真,这本书是一本必读的书。我从中学到了很多,只读过一次,我只理解了其中的25% :)
发布于 2008-09-30 07:29:33
您是否考虑过引入一个将employee_type和employee链接起来的转换(多对多)表,然后将employee操作链接到此转换表?转换表可以有一个额外的用于时间戳的列,这样您就可以按时间顺序跟踪事情。
https://stackoverflow.com/questions/152074
复制相似问题