【问题标题】:django db schema - creating tasks of different types, each w/ different fieldsdjango db schema - 创建不同类型的任务,每个任务都有不同的字段
【发布时间】:2011-07-16 15:16:45
【问题描述】:

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

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

我正在考虑使用 (name, description) 的 TaskType,但要使上述工作正常进行,每个人都必须具有 Program 和 Setting 的外键,即使任务不使用任何一个。这似乎不是最好的......还有其他方法吗?

【问题讨论】:

    标签: database django database-design django-models


    【解决方案1】:

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

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

    你也出现了一个约束,你需要判断它的重要性:

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

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

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

    但是,根据我的经验,模型继承存在概念性问题,您可能会遇到令人惊讶和不受欢迎的行为,例如更新任务。在这种情况下,我可以简单地将 Task 1:1 与 InstallTask​​ 和 1:1 与 SettingTask 放置。这实际上更灵活。

    【讨论】:

      【解决方案2】:

      不确定您的确切问题(数据不足),所以我的回答会有点抽象(或高级):)

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

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

      【讨论】:

        猜你喜欢
        • 2017-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        相关资源
        最近更新 更多