django db schema - 创建不同类型的任务,每个类型都有/不同的字段

时间:2011-03-16 14:06:58

标签: database django database-design django-models

对于以下场景,使用django的最佳数据库设计是什么:

我有一个数据库中的计算机列表。我想添加一个由计算机执行的任务。有不同的任务,每个任务都有不同的领域。例如,一个可能是“安装程序”,它具有Program表的ForeignKey,其中条目包含有关如何安装程序的信息。或者它可能类似于“更改设置”,包含设置表中的ForeignKey。

我正在考虑使用带有(名称,描述)的TaskType,但为了完成上述工作,每个人都必须拥有Program和Setting的外键,即使任务也没有使用。这似乎不是最好的...还有另一种方式吗?

2 个答案:

答案 0 :(得分:1)

如上所述,您的概念架构涉及以下谓词:

  • 任务存在
  • 计算机存在
  • 设置存在
  • 计划存在
  • 任务计算机
  • 上执行
  • 任务是更改设置
  • 任务是安装程序

你也看似一个约束,你需要判断它有多重要:

  • | P6加入P7 | = 0 - 没有任务来安装程序并更改设置

有些人可能会建议自然的Django解决方案是使用model inheritance来表示基本的“任务”模型,它有两个子类 - “InstallTask​​”和“SettingTask”。然后你随身携带 “计算机”作为基类的属性,或者具有另一个模型“ComputerTask”等。

使用模型继承可以带来一些好处,包括(1)在创建(例如)ChangeTask的同时获得对创建基本任务的一些支持,以及(2)鼓励但不强制执行约束的维护

但是,根据我的经验,模型继承存在概念性问题,您可能会遇到令人惊讶和不需要的行为,例如,更新任务。在这种情况下,我可能只使用InstallTask​​放置任务1:1,使用SettingTask放置1:1。这实际上更灵活。

答案 1 :(得分:0)

不确定您的确切问题(数据不够)所以我的回答将是一点抽象(或高级别):)

恕我直言,看起来您可能对使用内容类型的generic relations感兴趣。

使用此功能可以选择从一种模式链接到任何其他模式, 所以你可以把不同的对象作为参考。