【问题标题】:Database Design for Storing Checklists and Results用于存储清单和结果的数据库设计
【发布时间】: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


    【解决方案1】:

    您基本上需要将您的任务和清单保持为只读状态。任何修改都意味着新的任务或清单 ID。否则,从设计的角度来看,您应该对模型没问题。

    【讨论】:

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

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

    清单 -- 任务

    然后,当更新清单时,在 checklist_task 列表中构建一组新条目 order_in_list 应迁移到 checklist_task,因为任务顺序可能会在清单修订时发生变化。

    任务修订应导致清单替换为新版本。

    【讨论】:

      猜你喜欢
      • 2010-12-11
      • 2016-03-23
      • 2014-08-26
      • 2016-11-13
      • 1970-01-01
      • 2014-09-28
      • 2011-03-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多