首页 > 解决方案 > 性能:在 Postgresql ArrayField 中存储喜欢(django 示例)

问题描述

我有 2 个模型:PostComment,每个模型都可以被 喜欢User

1)当然,总喜欢应该呈现在每个Post或附近的某个地方Comment

2)但每个人都User应该有一个包含所有喜欢内容的页面。

所以,最明显的方法就是使用 m2m 字段,这似乎会在未来导致很多问题。

那这个呢?

1)PostComment模型应该有一些

users_liked_ids = ArrayField(models.IntegerField())

2)User模型也应该有这样的领域:

posts_liked_ids = ArrayField(models.IntegerField())
comments_liked_ids = ArrayField(models.IntegerField())

并且每次点User赞,都会执行两个动作:

1) 用户 ID 添加到帖子/评论users_liked_ids字段

2) 帖子/评论的 id 添加到用户posts_liked_ids/comments_liked_ids字段

问题是:

1)这是一个好计划吗?)

2)以这种方法进行查找以获取“是否喜欢帖子/评论”但当前用户是否有效?

3)将喜欢存储在一些单独的表中会更好,而不是在喜欢的模型中,而且在ArrayField

4) 使用明显的 m2m 可能更好?

标签: djangopostgresqlperformancedatabase-design

解决方案


1)
没有。 2) 绝对不是。
3) 绝对,难以置信。不要进一步拆分数据。
4) 是的。

以下是一些问题:

  • 没有参照完整性,因为您无法在数组元素上创建外键,这意味着您可以轻松地在 ID 数组中包含垃圾值
  • 具有用户 ID 的帖子和具有帖子 ID 的用户的数据重复意味着信息可能不同步(删除用户或帖子时会发生什么情况?)
  • 匹配数组中的低效查找(您的 #2)

在任何情况下都不要这样做。您可能希望结合您的“发布”和“评论”模型来简化关系,但这就是联结表的用途。数组适用于不涉及外键或极端长度的用例。


推荐阅读