这让我怀疑一段时间,所以我认为在这里发布它以找到一些见解是一个好主意,这是一个关系数据库建模问题/疑问
我有以下问题:
我有"问题"必须处于特定的"状态",所有状态的变化都必须经过审计.
我已经找到了两个解决方案,但我真的看不出它们之间的区别,如果有的话......你怎么看?
这是两张图的图像.
编辑:
选项A:表"questions"不应包含state_id,Question_State不应包含"id"字段.抱歉错误.
编辑2:
感谢所有现实世界的例子和见解,但这是一个学术问题,而不是真实世界相关的:).
图表http://i38.tinypic.com/2v27epl.png
我认为你所要问的要点是:问题的状态是否应该基于问题和状态之间的中间表,该表具有时间组件(A)或表应该更加静态,但是具有面向日志旁边的历史表(B).
(注意:如果你想做(A)的纯版本,那么Boofus是对的,你可能也不会把state_id放在Questions表中,因为它是多余的;但这肯定会带来不便,因为它会使简单查询以便在特定状态下获取问题更加困难.所以你在这里有一个混合版本.)
一般来说,如果保留有关状态的历史信息的要求实际上仅用于审计目的 - 也就是说,如果应用程序本身不会定期查询 - 那么你可能最好选择B,因为它是一个更简单(实际上只有一个"问题"表,带有状态的参考表,以及以前状态的"日志"表).我认为这表明你的意图好一点.
但是,如果应用程序语义更复杂(例如,如果您有"显示过去24小时内处于状态X的所有问题......"的查询),那么像(A)这样的方法可能更有意义.它实质上是将问题的状态变成与时间相关的事实.如果你这样做,只要知道它使事情变得复杂 - 要么你的所有查询都更难以考虑时间,要么你必须担心问题上的state_id与Questions表中的最新状态保持同步.如果你走那条路,可能会把它称为"current_state"或类似的东西,所以很明显它是一种衍生信息.