【问题标题】:How to model a 'history' table from a join table如何从连接表建模“历史”表
【发布时间】:2016-04-22 21:05:48
【问题描述】:

我需要为包含其他表的 id 的表跟踪一些历史记录:

我想跟踪 company_device 表的状态,以便我可以输入以了解关系状态何时更改(设备何时分配给公司,何时未分配等)。 company_device 表将仅包含当前的现有关系。所以我想做这样的“事情”:

但这行不通,因为它要求company_device 中有一条记录,才能在company_device_history 表中满足FK。例如,如果我

insert into company_device values (1,1);
insert into company_device_history values (1,1,'Assigned',now());

由于外键约束,我永远无法从 company_device 中删除记录。所以我目前已经解决了这个问题:

所以我不受外键的限制。

我的问题是:有没有更好的建模方法?我可以将 status 和 effective_date 添加到 company_device 表中,并根据 status 或 effective_date 进行查询,但这对我来说似乎不是一个好的解决方案。我想知道其他人会如何处理这个问题。

【问题讨论】:

  • 没关系。外键是不需要的,因为如果您将其删除并将其复制到 company_device_history 中,company_device 中将不存在记录。另一种选择是支持 SQL:2011 Temporal 的数据库,例如 DB2

标签: data-modeling


【解决方案1】:

当专门研究问题时(即,当对手头业务问题的性质进行建模时),您唯一需要的是一个带有 COMPANY_DEVICE_ASSIGNMENT 的表四列 C_ID、D_ID、FROM 和 TO,告诉您“设备 D_ID 已分配给公司 C_ID 从 FROM 到 TO”。

确实存在允许您在此基础上工作的系统,但是它们都不会说 SQL(一本深入处理时间数据主题的优秀书籍,我什至将其称为“规范”工作, 是“时间和关系理论 - 谷歌搜索不能错过)。如果您在 SQL 系统中执行此操作,这种“直截了当”的方法不会让您走得太远。在这种情况下,您的实际选择受限于:

  • 您想要/可以/必须使用的 DBMS 提供了哪些时间特征
  • 您想要/可以/必须使用的任何建模工具都支持哪些功能来生成 DDL。

正如 Neil 的评论所说:最新版本的 SQL 标准将“时间支持”作为其主要新颖性,它们与您的问题绝对相关,但实际提供这些功能的产品相对较少且相差甚远。

【讨论】:

    猜你喜欢
    • 2013-04-08
    • 2012-03-13
    • 2017-04-30
    • 2015-06-29
    • 2012-08-26
    • 2011-08-30
    • 2013-10-23
    • 1970-01-01
    • 2021-08-19
    相关资源
    最近更新 更多