我应该在ForeignKey上使用JSONField来存储数据吗?

时间:2018-11-20 16:35:16

标签: django django-models

我正面临一个难题,我正在开发一种新产品,而且我不想弄乱组织数据库中信息的方式。

我的模型有这两种选择,第一种是使用外键将它们链接在一起。

Class Page(models.Model):
    data = JsonField()

Class Image(models.Model):
    page = models.ForeignKey(Page)
    data = JsonField()

Class Video(models.Model):
    page = models.ForeignKey(Page)
    data = JsonField()

etc...

第二个是将所有内容保留在Page的JSONField中:

Class Page(models.Model):
    data = JsonField() # videos and pictures, etc... are stored here

一个比另一个更好,为什么?这将对我将来组织数据库的方式产生巨大的帮助。

我认为第二种选择可能会比较慢,因为每次更改所有json都会覆盖它,但这会产生很大的不同还是我所说的是错误的?

1 个答案:

答案 0 :(得分:2)

JSONField混淆了基础数据,使其难以编写可读代码并难以充分利用Django的内置ORM,验证和其他功能(例如ModelForm)。虽然它提供了灵活性,可以将所需的任何内容保存到数据库中(例如,添加新字段时无需迁移数据库),但它消除了显式字段的清晰度,并使得以后易于引入错误。

例如,如果您开始在数据中保存一个新密钥,然后尝试在代码中访问该密钥,则较旧的对象将没有该密钥,并且根据访问的对象,您的应用可能会崩溃。如果使用单独的字段,则不会发生这种情况。

除非没有其他方法,否则我总是会尽量避免这种情况。

通常我在两种情况下使用JSONField:

  • 要保存来自第三方API的响应(例如,作为审核跟踪)
  • 要保存对归档对象的引用(例如,当数据库中的实时产品发生更改但我仍然有引用该产品的订单时)。

如果将PostgreSQL作为关系数据库使用,则已对其进行优化以使其在JOIN上表现出色,因此使用ForeignKey s实际上是一件好事。在代码中使用select_relatedprefetch_related可以优化查询数量,但是即使对数百万个条目,查询本身也可以很好地扩展。