如何从几个对象/表中建立与常见对象/表的关系

时间:2013-07-28 02:44:13

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

我使用django并有三个对象:Customer,Location和Department。每个都有一个相关的Setting对象。

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

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

1 个答案:

答案 0 :(得分:1)

有几个选项

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

  2. 创建一个单独的设置表,并使用“设置”表中的GenericForeignKeys来引用您的对象(客户,位置和部门)。这样做的好处是,在所有需要设置的表中都没有额外的列。但是,您无法通过Django ORM的普通API与GenericForeignKeys进行数据库连接。你必须使用原始的SQL。此外,select_related对GenericForeignKeys不起作用,因此您必须使用prefetch_related。

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

  4. 每种选择都有其优点和缺点;所以,选择你的毒药;)