我坚持一个数据库设计问题。如何修复此架构以避免出现一致的数据问题?
(下面的django模型定义)
问题(至少我认为这是一个问题)是,如果我有一个TrainingTask,那么它可能具有TaskType的不一致值(通过直接外键和间接通过fk到TaskGroup)。
TaskTypes包含有关TrainingTasks的元信息。 TaskGroup用于对相同类型的任务进行分组。在我的应用程序的其他地方,我希望能够接受一个TaskGroup并说出#34;从这个TaskGroup"给我一个随机的TrainingTask。
另外,我在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消除)。
答案 0 :(得分:0)
唯一让我感到不对的是:
TrainingTask
必须有TaskGroup
,且他们的task_type
' s必须相同TrainingTask.task_type
,因为它可以通过TrainingTask.group.task_type
访问它。否则,
TrainingTask
可以存在而没有TaskGroup
,如果第二种情况属实,那么为了确保TaskType
"没有"不一致的值,您可以覆盖save()
的{{1}}方法和TaskGroup
,以便在更改TrainingTask
时,删除所有相关的群组/任务,或将相关群组/任务的task_type
更改为同一群组。