Database design 用于存储检查表和结果的数据库设计
我已经读过了,但答案要么无关紧要,要么不令人满意 我有许多检查表,它们被用作频繁重复操作的指南。随着每个程序的完善和改进,检查表会随着时间的推移慢慢演变 我想做的是存储一系列不同的检查表,每个检查表都包含任意数量的要完成的任务。系统的用户将能够创建一个新的清单实例,并在执行给定实例时勾选任务。此外,我需要将每个清单的各个实例存档,以便进行历史记录,这样我就能够返回并查看在给定列表上完成了什么(以什么顺序、由谁完成等)。(为了简单起见,我排除了下面的这些“元”字段。)我还希望能够随着时间的推移修改每个清单上的任务,而不会损坏历史实例。换句话说,这些检查表充当“模板”,从中创建和使用新实例 这带来了一个有趣的数据库设计挑战,因为您不能简单地将结果记录链接到它是其实例的任务记录的ID。例如,如果您希望能够更改每个任务记录中的文本以改进检查表,同时保持准确的结果,则以下架构将不起作用:Database design 用于存储检查表和结果的数据库设计,database-design,Database Design,我已经读过了,但答案要么无关紧要,要么不令人满意 我有许多检查表,它们被用作频繁重复操作的指南。随着每个程序的完善和改进,检查表会随着时间的推移慢慢演变 我想做的是存储一系列不同的检查表,每个检查表都包含任意数量的要完成的任务。系统的用户将能够创建一个新的清单实例,并在执行给定实例时勾选任务。此外,我需要将每个清单的各个实例存档,以便进行历史记录,这样我就能够返回并查看在给定列表上完成了什么(以什么顺序、由谁完成等)。(为了简单起见,我排除了下面的这些“元”字段。)我还希望能够随着时间的推移修改
Checklists
int(11) id
varchar(255) title // Text title of Checklist. I.e: "Household Chores"
Tasks
int(11) id
int(11) checklist_id // Which Checklist this Task belongs to.
int(11) order_in_list // Sort order for Tasks within a Checklist.
varchar(255) text // Text of the Task. I.e: "Take out garbage".
Results
int(11) id
int(11) instance_id // Groups a set of tasks into a historical Checklist instance.
int(11) task_id // Which Task this row is an instance of. Pull the text and order from here.
tinyint(1) checked // Whether the given instance has been completed or not.
用蛋糕的说法:
- 清单有许多任务
- 属于检查表的任务
- 一项任务有很多结果
- 结果属于任务
Results
int(11) id
int(11) checklist_id
int(11) order_in_list
varchar(255) text // Store the full text of the Task in each result instance!?
int(11) instance_id
tinyint(1) checked
在这种情况下:
- 清单有很多任务
- 清单有很多结果(<不足以描述关系!)
- 任务属于检查表
- 结果属于检查表
想法?您基本上需要将任务和检查表保持为只读。任何修改都意味着一个新的任务或检查表ID。否则,从设计的角度来看,您应该可以使用该模型。您基本上需要将任务和检查表保持为只读。任何修改都意味着一个新的任务或检查表ID。否则,从设计的角度来看,您应该可以使用该模型。我会将检查表任务关系分解为一个关系表。并添加一列来处理,指示检查表已更新。一个替换的检查表id将起作用 检查表-
任务修订应导致使用新版本替换检查表。我会将检查表-任务关系分解为关系表。并添加一列来处理,指示检查表已更新。一个替换的检查表id将起作用 检查表-
任务修订应导致使用新版本替换检查表。但是否有更好的存储格式?更像维基的东西可能是,每个检查表都有一个修订历史记录,并且给定检查表的答案组存储在特定修订号的参考中?每次编辑一个成员任务时都必须创建新的检查表ID似乎有点乏味。不,您需要一个检查表生成器,将现有的检查表(如您所说的模板)复制到新的检查表,并允许他们在提交可用的新ID之前修改它和/或任务。啊,这更有意义。我不想因为历史查找以外的任何原因而保留旧版本,因此一旦创建了新副本,构建器就需要隐藏旧版本。这是一个不错的方法。不过,出于好奇,我仍然有兴趣看到一种非关系的方法来解决这个问题。这毕竟是非常面向文档的,并且没有太多需要处理的“关系”。但是有更好的存储格式吗?更像维基的东西可能是,每个检查表都有一个修订历史记录,并且给定检查表的答案组存储在特定修订号的参考中?每次编辑一个成员任务时都必须创建新的检查表ID似乎有点乏味。不,您需要一个检查表生成器,将现有的检查表(如您所说的模板)复制到新的检查表,并允许他们在提交可用的新ID之前修改它和/或任务。啊,这更有意义。我不想因为历史查找以外的任何原因而保留旧版本,因此一旦创建了新副本,构建器就需要隐藏旧版本。这是一个不错的方法。不过,出于好奇,我仍然有兴趣看到一种非关系的方法来解决这个问题。这毕竟是非常面向文档的,没有太多的“关系”