【发布时间】:2016-03-01 10:10:23
【问题描述】:
事不宜迟,举个例子:
让我们考虑一个任意的例子,3 个表,一个有工人,一个有任务,一个链接表,并考虑历史“天”的分辨率
表“工人”,(PK)id
id | name
---+-----------
1 | Frank
2 | Sam
3 | Tony
---+-----------
表“任务”,(PK)id
id | name
---+--------------------
1 | walking the dog
2 | feeding the cat
3 | charging the robot
---+--------------------
表“task_assignments”, (PK)workers.id 作为 w_id, (FK)w_id, (FK) tasks.id 作为 t_id
w_id | t_id
-----+------
1 | 2
2 | 3
3 | 2
-----+------
所以现在一切似乎都清楚了,可能还有一种情况,即 t_id 是 (PK) 的一部分,在此示例中没有任何意义。链接表是直截了当的,但我如何实现良好的历史记录?
假设:
- 我于 1970 年 1 月 1 日将 w_id(1) 分配给 t_id(2)。
- 在 1970 年 1 月 2 日,我从他的任务中取消分配 w_id(1),没有留下任何条目 链接表。
- 在 1970 年 1 月 8 日,我将 w_id(1) 分配给了 t_id(1),这需要更长的时间。
- 在 1970 年 1 月 15 日,我再次从他的任务中取消分配 w_id(1),没有留下 链接表中的条目。
如何正确实现此历史记录以实现数据一致性和轻松查询?
我想轻松查询:
- w_id(?) 在 1970 年 1 月 3 日做了什么任务?
- 什么 w_id 从 1970-01-01 到 1970-01-10 没有任务?
- 从 1970 年 1 月 10 日到 1970 年 1 月 12 日,w_id(?) 做了哪些任务?
- 哪些任务目前没有分配给任何工作人员?
我可以更改链接表,使其也包含一个日期戳作为 (PK) 的一部分,并以这种方式存储分配,并像这样简单地在未分配时存储一个 t_id=null 的新行?
date_set | w_id | t_id
------------+------+------
1970-01-01 | 1 | 2
1970-01-02 | 2 | 3
1970-01-01 | 3 | 2
1970-01-02 | 1 | null
------------+------+------
或者我是否应该制作某种“历史表”,但是在不加倍链接表的情况下放什么?为链接表创建一个 AI-PK 并将其与日期戳一起存储在历史表中的一行中?以及如何处理未分配的周期?
是否存在某种“模式设计模式”?我根本不知道要搜索什么,所以基本上可以接受的答案也是指向涵盖该主题的文章的链接。
【问题讨论】:
-
你要么想使用支持 SQL:2011 Temporal 的数据库,要么使用历史表模式,在删除时复制到类似的表
标签: mysql database database-schema