如何修复此数据库架构以避免不一致?

时间:2014-04-24 22:13:45

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

我坚持一个数据库设计问题。如何修复此架构以避免出现一致的数据问题?

让我们考虑三个对象:

(下面的django模型定义)

  • 任务类型
  • 任务组
    • foreignkey to TaskType
  • TrainingTask
    • foreignkey to TaskType
    • foreignkey to TaskGroup

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

以及一些"事实"关于这些对象:

TaskTypes包含有关TrainingTasks的元信息。 TaskGroup用于对相同类型的任务进行分组。在我的应用程序的其他地方,我希望能够接受一个TaskGroup并说出#34;从这个TaskGroup"给我一个随机的TrainingTask。

  • TaskType可以有很多TrainingTasks。
  • 组中的所有TrainingTasks应具有相同的类型
  • TaskType
  • 可以有很多TaskGroup
  • 具有相同TrainingType的TrainingTasks可以位于不同的TaskGroups

另外,我在Django中做了所有这些,而TrainingTask是Task的子类(使用多表继承),因此TrainingTask从任务继承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消除)。

1 个答案:

答案 0 :(得分:0)

唯一让我感到不对的是:

  • 如果情况是每个TrainingTask必须有TaskGroup,且他们的task_type' s必须相同
  • 然后你可以完全摆脱TrainingTask.task_type,因为它可以通过TrainingTask.group.task_type访问它。

否则,

  • 如果TrainingTask可以存在而没有TaskGroup
  • 然后,在我看来,这是一种合理的方式。

如果第二种情况属实,那么为了确保TaskType"没有"不一致的值,您可以覆盖save()的{​​{1}}方法和TaskGroup,以便在更改TrainingTask时,删除所有相关的群组/任务,或将相关群组/任务的task_type更改为同一群组。