【问题标题】:Performance: Store likes in Postgresql ArrayField (django example)性能:在 Postgresql ArrayField 中存储喜欢(django 示例)
【发布时间】:2018-10-20 21:38:33
【问题描述】:

我有两个模型:PostComment,每个都可以被User点赞。

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

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 可能更好?

【问题讨论】:

    标签: django postgresql performance database-design


    【解决方案1】:

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

    这里有一些问题:

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

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

    【讨论】:

      猜你喜欢
      • 2022-01-27
      • 2010-10-07
      • 2015-12-21
      • 2015-12-25
      • 1970-01-01
      • 2017-12-17
      • 1970-01-01
      • 2017-12-26
      • 2020-11-04
      相关资源
      最近更新 更多