我正面临一个难题,我正在开发一种新产品,而且我不想弄乱组织数据库中信息的方式。
我的模型有这两种选择,第一种是使用外键将它们链接在一起。
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都会覆盖它,但这会产生很大的不同还是我所说的是错误的?
答案 0 :(得分:2)
JSONField
混淆了基础数据,使其难以编写可读代码并难以充分利用Django的内置ORM,验证和其他功能(例如ModelForm
)。虽然它提供了灵活性,可以将所需的任何内容保存到数据库中(例如,添加新字段时无需迁移数据库),但它消除了显式字段的清晰度,并使得以后易于引入错误。
例如,如果您开始在数据中保存一个新密钥,然后尝试在代码中访问该密钥,则较旧的对象将没有该密钥,并且根据访问的对象,您的应用可能会崩溃。如果使用单独的字段,则不会发生这种情况。
除非没有其他方法,否则我总是会尽量避免这种情况。
通常我在两种情况下使用JSONField:
如果将PostgreSQL作为关系数据库使用,则已对其进行优化以使其在JOIN上表现出色,因此使用ForeignKey
s实际上是一件好事。在代码中使用select_related
和prefetch_related
可以优化查询数量,但是即使对数百万个条目,查询本身也可以很好地扩展。