gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:10:06 27 4
gpt4 key购买 nike

我正面临两难境地,我正在创建一个新产品,我不想弄乱我在数据库中组织信息的方式。

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

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 都会被覆盖,但这会产生巨大的差异还是我说的是错误的?

最佳答案

一个 JSONField混淆了底层数据,使得编写可读代码和充分利用 Django 的内置 ORM、验证和其他细节(例如 ModelForm s)变得困难。虽然它可以灵活地将您想要的任何内容保存到数据库中(例如,在添加新字段时无需迁移数据库),但它消除了显式字段的清晰度,并且很容易在以后引入错误。

例如,如果您开始在数据中保存一个新键,然后尝试在代码中访问该键,则旧对象将不具有它,并且您可能会发现应用程序崩溃,具体取决于您正在访问的对象。如果您使用单独的字段,则不会发生这种情况。

我总是尽量避免它,除非没有其他办法。

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

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

  • 如果您使用 PostgreSQL 作为关系数据库,它会被优化为在 JOIN 上表现出色,因此使用 ForeignKey s其实是个好东西。使用 select_relatedprefetch_related在您的代码中优化查询的数量,但即使对于数百万个条目,查询本身也可以很好地扩展。

    关于django - 我应该在 ForeignKey 上使用 JSONField 来存储数据吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53397508/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com