我已经阅读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的经验有限。这些会为历史清单数据提供一个更好的存储机制吗?这似乎具有将核对清单或实例的所有数据逻辑分组到单个文档记录中的优势。
想法?
虽然有更好的存储格式吗?更类似维基的东西可能是每个检查表的维护历史记录维护的地方,并且给定检查清单的答案组是根据特定的修订版本号存储的?每次编辑一个成员任务时,必须创建新的核对清单ID似乎有点乏味。 – beporter 2010-09-07 21:17:13
不,您需要一个清单生成器,将现有清单(模板,就像您所说的)复制到新清单,并允许他们在提交可用的新ID之前修改它和/或任务。 – Beth 2010-09-07 21:34:29
啊,这更有意义。不过,除了历史查询以外,我不想保留旧版本,以便构建器在新副本生成后需要隐藏旧版本。不是一个坏方法。出于好奇,我仍然有兴趣看到这个问题的非关系方法。这毕竟是非常面向文档的,并且没有太多需要操纵的“关系”。 – beporter 2010-09-07 21:47:55