性能:在Postgresql ArrayField中存储喜欢(django示例)

时间:2018-05-10 14:59:55

标签: django postgresql performance database-design

我有2个模型:CommentUser,每个模型都可以被Post所喜欢。

1)当然,应该在每个CommentUser

附近展示总喜欢的内容

2)但是每个Post也应该有一个包含所有喜欢内容的页面。

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

这是怎么回事?

1)Commentusers_liked_ids = ArrayField(models.IntegerField()) 模型应该有一些

User

2)posts_liked_ids = ArrayField(models.IntegerField()) comments_liked_ids = ArrayField(models.IntegerField()) 模型也应该有这样的字段:

User

每次users_liked_ids喜欢某事时,都会执行两项操作:

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

2)帖子/评论的ID添加到用户的ArrayField字段

问题是:

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

2)以这种方式进行查找是否有效获得"是否赞成帖子/评论?但当前用户

3)将喜欢的内容存储在一些单独的表中,而不是喜欢中 模型,但也在ng test --prod

4)可能更好地留在明显的m2m?

1 个答案:

答案 0 :(得分:4)

1)不。
2)绝对不是。
3)绝对,令人难以置信的不是。不要进一步分割你的数据 4)是的。

以下是一些问题:

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

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