【发布时间】:2011-04-09 10:01:25
【问题描述】:
我已经阅读了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.
用蛋糕的说法:
清单包含许多任务
任务属于清单
一个任务有很多结果
结果属于任务
稍作修改将在结果中创建每个任务的完整副本。这让我们可以保留按 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
在这种情况下:
清单包含许多任务
Checklist HasMany Results(
任务属于清单
结果属于清单
乍一看,完全复制每个任务的文本和顺序似乎很浪费,但我想不出一个很好的替代方案来保留历史清单实例的文本。
目前我的想法是关系数据库可能不是解决此问题的最佳解决方案,但我对 Mongo 或 Couch 等文档数据库的经验有限。这些会为历史清单数据提供更好的存储机制吗?这似乎具有将清单或实例的所有数据逻辑分组到单个文档记录中的优势。
想法?
【问题讨论】:
标签: database-design