我认为您要问的要点是:问题的状态是否应该基于 Questions 和 State 之间的具有时间分量 (A) 的中间表,或者该表是否应该更加静态,但具有面向日志的侧面的历史表(B)。
(注意:如果你想做一个纯版本的(A),那么 Boofus 是对的,你可能不会把 state_id 也放在 Questions 表中,因为它是多余的;但这肯定不方便,因为它会使简单的查询来获得特定状态下的问题要困难得多。所以你在这里有一个混合版本。)
一般来说,如果保留有关状态的历史信息的要求真的只是为了审计目的——也就是说,如果应用程序本身不会定期查询它——你可能最好选择选项 B,因为它是稍微简单一点(实际上只有一个“问题”表,有一个状态参考表,以及一个用于先前状态的“日志”表)。我认为这更好地表明了你的意图。
但是,如果应用程序语义更复杂(例如,如果您有诸如“显示过去 24 小时内处于状态 X 的所有问题......”之类的查询),那么像 (A) 这样的方法可能更有意义。它本质上是把一个问题的状态变成一个与时间相关的事实。如果您这样做,请注意这会使事情变得复杂 - 您的所有查询都更难并且必须考虑时间,或者您必须担心保持 Questions 上的 state_id 与 Questions 表中的最新状态同步。如果你走那条路,也许在 Questions 上称它为“current_state”或其他名称,所以很明显它是一种衍生信息。