2010-09-07 87 views
0

我已经阅读thesequestions但答案要么不相关,要么不令人满意。数据库设计用于存储清单和结果

我有许多检查表用作频繁重复检查的指南。随着每个程序的完善和改进,清单逐渐演变。

我期待做的是存储大量不同的清单,每个清单都包含一个任意的,有序的任务数量来完成。系统的用户将能够创建一个新的清单实例,并在任务进行时勾选任务。此外,我需要将每个检查清单的各个实例存档以进行历史记录保存,以便我能够返回并查看给定清单中已完成的内容(以何种顺序,由谁等)。 (为了简单起见,我已经在下面排除了这些“元”字段。)我还希望能够修改每个检查清单上的任务,而不会破坏历史实例。换句话说,这些清单作为“模板”,从中创建和使用新的实例。

这提出了有趣的数据库设计挑战,因为您不能简单地将结果记录链接到它是实例的任务记录的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. 

要使用蛋糕的说法:

  • 一个清单的hasMany任务

  • 任务属于关联清单

  • 任务的hasMany结果

  • 一个结果属于关联任务

轻微修改将在结果创建的每个任务的完整副本。这让我们保留由instance_id分组的任务的历史“集合”,以表示包括填充位的单个Checklist实例。

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 

在这种情况下:(!<不足以描述这种关系)

  • 清单的hasMany任务

  • 清单的hasMany结果

  • 任务属于关联清单

  • 结果属于关联清单

乍一看,这似乎是一种浪费文字和每个任务的顺序完全照搬,但我不能拿出,保留历史清单实例的文字一个不错的选择。

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

想法?

回答

1

你基本上需要保持你的任务和核对清单是只读的。任何修改意味着新的任务或清单ID。否则,从设计的角度来看,你应该对模型很好。

+0

虽然有更好的存储格式吗?更类似维基的东西可能是每个检查表的维护历史记录维护的地方,并且给定检查清单的答案组是根据特定的修订版本号存储的?每次编辑一个成员任务时,必须创建新的核对清单ID似乎有点乏味。 – beporter 2010-09-07 21:17:13

+0

不,您需要一个清单生成器,将现有清单(模板,就像您所说的)复制到新清单,并允许他们在提交可用的新ID之前修改它和/或任务。 – Beth 2010-09-07 21:34:29

+0

啊,这更有意义。不过,除了历史查询以外,我不想保留旧版本,以便构建器在新副本生成后需要隐藏旧版本。不是一个坏方法。出于好奇,我仍然有兴趣看到这个问题的非关系方法。这毕竟是非常面向文档的,并且没有太多需要操纵的“关系”。 – beporter 2010-09-07 21:47:55

0

我会将清单任务关系分解为关系表。并添加一列来处理,指示检查清单已更新。 replacement_checklist_id会起作用。

清单 - < checklist_task> - 任务

然后,当一个清单进行更新,建立一套新的checklist_task列表order_in_list条目应该被迁移到checklist_task作为任务顺序可能会改变清单修订。

任务修订应该会导致用新版本替换核对表。