【问题标题】:how to make a relation from several objects/tables with a relation to common objects/tables如何从多个对象/表与公共对象/表的关系建立关系
【发布时间】:2013-07-28 02:44:13
【问题描述】:

我正在使用 django 并拥有三个对象:客户、位置和部门。每个都有一个相关的设置对象。

使用可选/空外键创建单个表是否更好?

或者为 3 个实体中的每一个创建不同的设置对象/表?

【问题讨论】:

    标签: django orm django-models relational-database entity-relationship


    【解决方案1】:

    有几个选项

    1. 创建一个单独的 Settings 表,并从您的所有对象到 Settings 表有一个可为空的 ForeignKey。如果您选择此选项,您应该创建一个 abstract base class,它具有指向 Settings 表的 ForeignKey 并从该抽象基类继承。这样您就不必每次创建新模型时都添加 ForeignKey。

    2. 创建一个单独的设置表并使用设置表中的GenericForeignKeys 来引用您的对象(客户、位置和部门)。这样做的好处是在所有需要设置的表中都没有额外的列。但是,您不能通过 Django ORM 的普通 API 使用 GenericForeignKeys 进行 DB 连接。您必须使用原始 sql。此外,select_related 不适用于 GenericForeignKeys,因此您必须改用 prefetch_related。

    3. 将设置存储在数据库的列中。您应该以某种格式(我喜欢 JSON)与数据进行交互,然后将其序列化为字符串以存储在数据库中。然后要读取设置,您可以将字符串反序列化回 JSON 并与之交互。使用这种方法,您不需要加入另一个表来获取设置,也不需要在每次添加新设置时运行迁移。您也不需要单独的设置表。但是,构造一个查询来查找具有某些设置的对象会很痛苦,而且查询也可能很慢。

    每个选项都有其优点和缺点;所以,选择你的毒药;)

    【讨论】:

    • 那么这些选项之一是最佳形式还是更有利于体现 DRY 原则?
    • 我认为所有这些选项都相对干燥。如果您使用抽象基类,选项 #1 和 #3 是 DRY。选项 #2 默认为 DRY。对于这种情况,我认为使用是最重要的因素。您打算如何使用这些设置以及您打算在设置中存储什么?
    • 我完全使用通用外键。效果很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多