【问题标题】:Database Schema nestest Tasklist数据库模式嵌套任务列表
【发布时间】:2020-06-26 16:29:01
【问题描述】:

我正在为有序任务列表创建数据库。由于某些任务是重复的,我需要一个“taskList”,它可以再次包含任务和其他任务列表。

Find example here

在上面的示例中,TaskList 1 由 [TaskList2, Task5, Task 6, TaskList3] 组成,其中 TaskList2 由 [Task1, Task2, Task3, Task4] 等组成。

我的主要问题是: 设置数据库模式来处理这种嵌套多态性的最佳方法是什么? (我正在使用 Laravel ORM)

【问题讨论】:

  • 定义“最佳”!!
  • 我不确定它是否适用于这种情况,但您可能想研究“嵌套集”。这是一种以易于操作(尽管难以维护)的方式表示对象层次结构的方式。 en.wikipedia.org/wiki/Nested_set_model

标签: mysql laravel database-design eloquent rdbms


【解决方案1】:

从概念上讲,您的问题可以通过将任务列表视为任务列表项的有序聚合来解决,这些项是任务或(其他)任务列表,如下面的类图所述:

实现此概念模型的数据库架构由下表架构提供(其中 PK/FK = 主键/外键,并且 ? = 可选):

tasklists( PK id, name)
tasks( PK id, name)
tasklistitems( 
    FK tasklist REF tasklists, 
    seq_no, 
    FK taskitem? REF tasks, 
    FK tasklistitem? REF tasklists
)

这样tasklistitems 的每一行通过其第一个(外键)属性与任务列表相关,并通过相应的可选外键属性taskitemtasklistitem 引用任务或任务列表。

请注意,任务列表项的序列号属性实现了它们的排序。

【讨论】:

  • 为什么要使用 FK tasklist_id 和 FK tasklist_id?
  • 这是一个命名错误,我已更正。第一个tasklist_id FK 属性应该将项目与任务列表相关联,而第二个是可选的,并将另一个任务列表作为项目引用。请注意,我已经改进了我的答案,现在使用了类图。
  • @Simon Bigelmayr:我已在tasklistitems 架构中的外键中添加了REFERENCES 子句。
猜你喜欢
  • 1970-01-01
  • 2018-03-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多