Database design 用于存储检查表和结果的数据库设计

Database design 用于存储检查表和结果的数据库设计,database-design,Database Design,我已经读过了,但答案要么无关紧要,要么不令人满意 我有许多检查表,它们被用作频繁重复操作的指南。随着每个程序的完善和改进,检查表会随着时间的推移慢慢演变 我想做的是存储一系列不同的检查表,每个检查表都包含任意数量的要完成的任务。系统的用户将能够创建一个新的清单实例,并在执行给定实例时勾选任务。此外,我需要将每个清单的各个实例存档,以便进行历史记录,这样我就能够返回并查看在给定列表上完成了什么(以什么顺序、由谁完成等)。(为了简单起见,我排除了下面的这些“元”字段。)我还希望能够随着时间的推移修改

我已经读过了,但答案要么无关紧要,要么不令人满意

我有许多检查表,它们被用作频繁重复操作的指南。随着每个程序的完善和改进,检查表会随着时间的推移慢慢演变

我想做的是存储一系列不同的检查表,每个检查表都包含任意数量的要完成的任务。系统的用户将能够创建一个新的清单实例,并在执行给定实例时勾选任务。此外,我需要将每个清单的各个实例存档,以便进行历史记录,这样我就能够返回并查看在给定列表上完成了什么(以什么顺序、由谁完成等)。(为了简单起见,我排除了下面的这些“元”字段。)我还希望能够随着时间的推移修改每个清单上的任务,而不会损坏历史实例。换句话说,这些检查表充当“模板”,从中创建和使用新实例

这带来了一个有趣的数据库设计挑战,因为您不能简单地将结果记录链接到它是其实例的任务记录的ID。例如,如果您希望能够更改每个任务记录中的文本以改进检查表,同时保持准确的结果,则以下架构将不起作用:

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.
用蛋糕的说法:

  • 清单有许多任务

  • 属于检查表的任务

  • 一项任务有很多结果

  • 结果属于任务

稍微修改一下,在结果中创建每个任务的完整副本。这使我们能够保留按实例id分组的任务的历史“集合”,以表示单个清单实例,包括填写的位

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
在这种情况下:

  • 清单有很多任务

  • 清单有很多结果(<不足以描述关系!)

  • 任务属于检查表

  • 结果属于检查表

乍一看,完全复制文本和每个任务的顺序似乎是浪费,但我无法想出一个好的替代方案来保留历史清单实例的文本

目前我的想法是,关系数据库可能不是解决这个问题的最佳解决方案,但我对Mongo或Coach等文档数据库的经验有限。这些会为历史检查表数据提供更好的存储机制吗?这似乎具有将清单或实例的所有数据逻辑分组到单个文档记录中的优势


想法?

您基本上需要将任务和检查表保持为只读。任何修改都意味着一个新的任务或检查表ID。否则,从设计的角度来看,您应该可以使用该模型。

您基本上需要将任务和检查表保持为只读。任何修改都意味着一个新的任务或检查表ID。否则,从设计的角度来看,您应该可以使用该模型。

我会将检查表任务关系分解为一个关系表。并添加一列来处理,指示检查表已更新。一个替换的检查表id将起作用

检查表--任务

然后,当更新检查表时,在检查表任务列表中构建一组新的条目,因为任务顺序可能会随着检查表的修订而改变,因此应将检查表任务列表中的任务顺序迁移到检查表任务中


任务修订应导致使用新版本替换检查表。

我会将检查表-任务关系分解为关系表。并添加一列来处理,指示检查表已更新。一个替换的检查表id将起作用

检查表--任务

然后,当更新检查表时,在检查表任务列表中构建一组新的条目,因为任务顺序可能会随着检查表的修订而改变,因此应将检查表任务列表中的任务顺序迁移到检查表任务中


任务修订应导致使用新版本替换检查表。

但是否有更好的存储格式?更像维基的东西可能是,每个检查表都有一个修订历史记录,并且给定检查表的答案组存储在特定修订号的参考中?每次编辑一个成员任务时都必须创建新的检查表ID似乎有点乏味。不,您需要一个检查表生成器,将现有的检查表(如您所说的模板)复制到新的检查表,并允许他们在提交可用的新ID之前修改它和/或任务。啊,这更有意义。我不想因为历史查找以外的任何原因而保留旧版本,因此一旦创建了新副本,构建器就需要隐藏旧版本。这是一个不错的方法。不过,出于好奇,我仍然有兴趣看到一种非关系的方法来解决这个问题。这毕竟是非常面向文档的,并且没有太多需要处理的“关系”。但是有更好的存储格式吗?更像维基的东西可能是,每个检查表都有一个修订历史记录,并且给定检查表的答案组存储在特定修订号的参考中?每次编辑一个成员任务时都必须创建新的检查表ID似乎有点乏味。不,您需要一个检查表生成器,将现有的检查表(如您所说的模板)复制到新的检查表,并允许他们在提交可用的新ID之前修改它和/或任务。啊,这更有意义。我不想因为历史查找以外的任何原因而保留旧版本,因此一旦创建了新副本,构建器就需要隐藏旧版本。这是一个不错的方法。不过,出于好奇,我仍然有兴趣看到一种非关系的方法来解决这个问题。这毕竟是非常面向文档的,没有太多的“关系”