django - 性能:在 Postgresql ArrayField 中存储喜欢(django 示例)
问题描述
我有 2 个模型:Post
和Comment
,每个模型都可以被 喜欢User
。
1)当然,总喜欢应该呈现在每个Post
或附近的某个地方Comment
2)但每个人都User
应该有一个包含所有喜欢内容的页面。
所以,最明显的方法就是使用 m2m 字段,这似乎会在未来导致很多问题。
那这个呢?
1)Post
和Comment
模型应该有一些
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 可能更好?
解决方案
1)
没有。 2) 绝对不是。
3) 绝对,难以置信。不要进一步拆分数据。
4) 是的。
以下是一些问题:
- 没有参照完整性,因为您无法在数组元素上创建外键,这意味着您可以轻松地在 ID 数组中包含垃圾值
- 具有用户 ID 的帖子和具有帖子 ID 的用户的数据重复意味着信息可能不同步(删除用户或帖子时会发生什么情况?)
- 匹配数组中的低效查找(您的 #2)
在任何情况下都不要这样做。您可能希望结合您的“发布”和“评论”模型来简化关系,但这就是联结表的用途。数组适用于不涉及外键或极端长度的用例。
推荐阅读
- python - 如何将numpy对象数组转换为包含每个对象元素的数组?
- javascript - 当光标在重叠的多段线上时,如何处理所有多段线上的点击事件?
- javascript - 如何以编程方式触发 select dropdown onchange 事件?
- isql - 如何通过 ISQL 查询在 SYBASE 中提取具有实际列大小而不是固定列大小的数据
- python - fsolve 在求解简单代数方程时返回不必要的警告
- powerbi - Power BI - 如何在从桌面发布到服务时修复“404 错误”
- node.js - Docker 中的节点:npm 测试并退出
- entity-framework-6 - using 语句中使用的类型必须可显式转换为“System.IDisposable”
- firebase - Firestore 子集合与数组
- arduino - 如何修复数字阅读