我已阅读these questions,但答案无关紧要或不满意。
我有许多清单,可用作经常重复程序的指南。随着每个程序的完善和改进,检查表会随着时间的推移而缓慢发展。
我要做的是存储一些不同的清单,每个清单都包含要完成的任意有序数量的任务。系统的用户将能够创建新的检查表实例,并在执行该给定实例时勾选任务。此外,我需要存档每个清单的各个实例以保存历史记录,以便我能够返回并查看给定列表上已完成的内容(按什么顺序,由谁等)。 (为简单起见,我在下面排除了这些“元”字段。)我还希望能够在不破坏历史实例的情况下随时修改每个清单上的任务。换句话说,这些清单用作“模板”,从中创建和使用新实例。
这提出了有趣的数据库设计挑战,因为您不能简单地将结果记录链接到它是其实例的任务记录的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.
使用Cake的说法:
清单HasMany任务
任务属于清单
任务HasMany结果
结果属于任务
稍作修改就是在结果中创建每个任务的完整副本。这使我们可以保留由instance_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
在这种情况下:
核对清单HasMany任务
核对清单HasMany结果(<不足以描述这种关系!)
任务属于核对清单
结果属于清单
乍一看,完全复制文本和每个任务的顺序似乎很浪费,但我无法想出一个保留历史清单实例文本的好方法。
目前我的想法是关系数据库可能不是解决此问题的最佳解决方案,但我对Mongo或Couch等文档数据库的经验有限。这些会为历史清单数据提供更好的存储机制吗?这似乎具有将核对表或实例的所有数据逻辑分组到单个文档记录中的优势。
思想?
答案 0 :(得分:1)
您基本上需要将任务和清单保持为只读。任何修改都意味着新任务或清单ID。否则,从设计的角度来看,你应该对模型没问题。
答案 1 :(得分:0)
我会将Checklist任务关系分解为关系表。并添加一个列来处理,表明核对表已更新。 replacement_checklist_id可以使用。
清单 - < checklist_task> - 任务
然后,当更新核对表时,在checklist_task列表中构建一组新条目order_in_list应该迁移到checklist_task,因为任务顺序可能会在核对表修订中更改。
任务修订应该导致用新版本替换清单。