【发布时间】: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