【问题标题】:How to fix this database schema to avoid inconsistency?如何修复此数据库架构以避免不一致?
【发布时间】:2014-06-10 10:36:40
【问题描述】:

我陷入了数据库设计的问题。如何修复此架构以避免后续数据一致出现问题?

让我们考虑三个对象:

(django 模型定义如下)

  • 任务类型
  • 任务组
    • TaskType 的外键
  • 培训任务
    • TaskType 的外键
    • TaskGroup 的外键

问题(至少我认为这是一个问题)是,如果我有一个 TrainingTask,那么它可能具有不一致的 TaskType 值(通过直接外键和间接通过 fk 到 TaskGroup)。

以及关于这些对象的一些“事实”:

TaskTypes 包含关于 TrainingTasks 的元信息。 TaskGroups 用于对相同类型的任务进行分组。在我的应用程序的其他地方,我希望能够获取一个任务组并说“从这个任务组给我一个随机的 TrainingTask”。

  • 一个TaskType 可以有很多TrainingTask。
  • 一个组中的所有 TrainingTasks 应该具有相同的类型
  • 一个任务类型可以有很多任务组
  • 具有相同TrainingType 的TrainingTasks 可以在不同的TaskGroups 中

另外,我在 Django 中执行所有这些操作,TrainingTask 是 Task 的子类(使用多表继承),因此 TrainingTask 从 Task 继承 fk 到 TaskType。我想保留这个结构,这样无论我手头有 Task 还是 TrainingTask 我都可以查询它的 TaskType 是什么,例如task.task_type 或 trainingtask.task_type。相关模型定义为:

from somewhere import Task

class TaskType(models.Model):
    ...fields...


class TaskGroup(models.Model):
    task_type = models.ForeignKey(TaskType)


class TrainingTask(Task):
    group = models.ForeignKey(TaskGroup)
    #task_type = models.ForeignKey(TaskType)  # FK to TaskType is contained in Task class

由于从 TrainingTask 到 TaskType 的多条路径,当前的设计“感觉不对”。我知道我可以在保存 TrainingTask 时添加模型级别的完整性检查,这总比没有好,但它仍然看起来可能会更好。实际上,使用 django-autofixture 等自动装置也会变得复杂。

我认为“这是错误的”是错误的吗?或者,如果没有,考虑到上面给出的“事实”(特别是“一个组中的所有 TrainingTasks 应该具有相同的类型”,我该如何修复这个模式,在我看来,这似乎排除了从 TaskGroup 到 TaskType 的 fk )。

【问题讨论】:

    标签: sql database django database-design database-normalization


    【解决方案1】:

    唯一让我觉得不对劲的是:

    • 如果每个TrainingTask 都必须有一个TaskGroup,并且它们的task_type 必须相同
    • 然后您可以完全摆脱TrainingTask.task_type,因为它可以通过TrainingTask.group.task_type 访问它。

    否则,

    • 如果TrainingTask 可以在没有TaskGroup 的情况下存在,
    • 那么在我看来,这样做是一种不错的方式。

    如果第二种情况为真,那么为确保没有“TaskType 的值不一致”,您可以覆盖TaskGroupTrainingTasksave() 方法,这样如果它们的task_type已更改,要么删除所有相关组/任务,要么将相关组/任务的 task_type 更改为相同的。

    【讨论】:

    • TrainingTask 必须有一个TaskGroup,但是TrainingTask 继承了Task 类的FK 到TaskType(它没有组- 至少现在没有实现......虽然现在可能我考虑了一下,为基础 Task 类添加一个 Group 也可能有意义)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-18
    • 2021-11-14
    • 2021-03-29
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多