如何设计n:m关系的历史

时间:2015-06-23 10:20:37

标签: sql plsql many-to-many

问题:

我在表A和另一个表B之间有一个:m关系,并且需要具有此关系的完整历史记录,换句话说,我必须能够重现状态过去的任何一点。

思路:

我的第一个尝试是通过插入虚拟表来解析关系到1:m和m:n关系,以便在发生某些变化时在任何给定时间保存关系的状态。像这样:

TABLE A         TABLE B
--------        ---------
ID   INT        ID    INT                   

TABLE HIST             TABLE CROSS_REF
----------             -----------------
ID        INT          REF_B_ID      INT
REF_A_ID  INT          REF_HIST_ID   INT
VERSION   TIMESTAMP

Pro:查询所需信息很容易。 Con:此尝试将创建大量冗余数据,尤其是当" B" -Side很大且只有很小的变化时。 (例如在用例"公司 - 员工")

第二种方法是维持两个n:m关系,一个用于当前状态,一个用于发生的变化。

TABLE A         TABLE B
--------        ---------
ID   INT        ID    INT                   

TABLE CHANGES          TABLE CROSS_REF
----------             -----------------
REF_A_ID     INT          REF_A_ID      INT
REF_B_ID     INT          REF_B_ID   INT
ACTION_TIME  TIMESTAMP
ACTION_TYPE  VARCHAR

Pro:没有冗余数据。 Con:过去很难查询特定时间点的状态。

问题

  • 您是否有其他建议如何为此应用程序设计数据模型?
  • 如果没有更好的方法可以解决这个问题:我应该走哪条路?或者它主要取决于给定的用例,如上所述的例子?
  • 如果我采用第二种方法,那么在过去的特定时间点查询状态怎么样?我能够在客户端解决这个问题,但我也想知道数据库方面的解决方案。 (PL / SQL也是可行的)

1 个答案:

答案 0 :(得分:2)

这个常用的模型怎么样?

QStandardPaths::locateAll(QStandardPaths::GenericDataLocation, QLatin1String("mime/packages"),
                          QStandardPaths::LocateDirectory);

(注意我和你一样使用create table cross_ref ( a_id references a , b_id references b , from_ts timestamp , to_ts timestamp , primary key (a_id, b_id, from_ts) ); ;通常我会使用timestamp