首页 > 解决方案 > 使用带有 JSON 的文本字段而不是 ForeignKey 关系?

问题描述

我正在开发一个用户可以掷骰子池的项目。例如,一个骰子池是一个掷骰子,有 3 个红色骰子、2 个蓝色骰子和 1 个绿色骰子。一个池由几个骰子掷骰和修改器组成。

我以这种方式连接了 3 个模型:

class DicePool(models.Model):
    # some relevant fields

class DiceRoll(models.Model):
    pool = models.ForeignKey(DicePool, on_delete=models.CASCADE)
    # plus a few more information fields with the type of die used, result, etc

class Modifier(models.Model):
    pool = models.ForeignKey(DicePool, on_delete=models.CASCADE)
    # plus about 4 more information fields

现在,当我加载DicePool历史记录时,我需要同时预取DiceRollModifier

我现在正在考虑用Modifier包含一些 JSON 的文本字段替换模型DicePool。只是为了减少数据库查询的数量。

使用 json 文本字段而不是数据库关系是否常见?

还是我认为这是错误的,每次加载池时对 prefetch_related 进行额外查询是完全正常的?

我个人发现使用 ForeignKey 清洁器,如果需要,它可以让我对数据进行 db-wise 更改。但是我的代码进行了太多的数据库查询,我试图看看我可以在哪里改进它。

仅供参考:我正在使用 MySQL

标签: djangodatabase

解决方案


使用 JSON 文本字段而不是数据库关系是否常见?

我不这么认为。另外,我不认为这是可取的,因为(尤其是使用不支持 JSONField 之类的 MySQL)你最终会得到一个文本,然后你需要以某种方式将其解析为 dict,然后查找你想要的东西想。

就个人而言(我认为大多数人)会坚持 FK 关系。此外,通过做prefetch_relatedorselect_related你已经避免了不必要的查询。


推荐阅读