【问题标题】:Is it good to store chat messages in json field django?将聊天消息存储在json字段django中好吗?
【发布时间】:2023-03-26 00:15:01
【问题描述】:

在我的 django 应用程序中,我需要一个用于用户和作者之间对话的应用程序,因为我计划将模型制作为 -

class AuthorContact(models.Model):
    messages = JSONField(default=dict)
    user = models.ForeginKey(User,related_name="contact_user",on_delete=models.CASCADE)
    author = models.ForeginKey(Author, related_name="contact_manager",on_delete=models.CASCADE)

我打算将消息存储为 -

{
'1':{'sender':'user','date':'02/12/2019','message':'Hi I read your book, it\'s amazing !'},
 '2':{'sender':'author','date':'0312/2019','message':'Thank you, it\'s my pleasure.}'
}

如果消息是CharField,那么我需要为每条带有用户和作者的消息创建对象。

我这样做是因为我不需要为每条消息创建对象,并且数据库很容易找到特定用户和作者之间的对话。

我的问题是 -

这是个好习惯吗?

PostgreSQL 允许在这个 json 字段中存储多少最大大小?

这个技巧是否有益,而不是为每条消息创建对象然后搜索特定的聊天?

他们还有其他更好的方法吗?

【问题讨论】:

    标签: sql django postgresql django-models


    【解决方案1】:

    我会说这个解决方案并不理想。

    json 类型在 postgres 中的最大大小是无限的,但我认为您不希望通过大型 json dict 转储采取这个方向。当这个字段增长时,检索它的时间只会增长。最终,您必须以某种方式在 API 端过滤掉某些内容,否则您将不得不通过网络将整个文本 blob 发送给您的用户。

    Postgres 是一个出色的关系数据库,我认为您想利用这一点。用它们所拥有的关系向数据库描述你的对象。

    我认为,在使用关系数据库进行未来开发时,您通常会体验到更快的速度和更大的灵活性。也就是说,在您已经知道数据结构或对检索速度没有要求的情况下。

    这是来自postgres documentation on JSON types

    8.14.2。有效地设计 JSON 文档

    将数据表示为 JSON 比 传统关系数据 模型,这在有需求的环境中很有吸引力 体液。这两种方法很可能同时存在并且 在同一应用程序中相互补充。然而,即使对于 在需要最大灵活性的应用中,它仍然是 建议 JSON 文档具有某种固定的结构。这 结构通常未强制执行(尽管强制执行某些业务 声明式规则是可能的),但具有可预测的结构 使编写有用地总结一组查询的查询变得更容易 表格中的“文档”(基准)。

    JSON 数据受制于相同的并发控制注意事项 存储在表中时的任何其他数据类型。虽然存储大 文件是可行的,请记住,任何更新都需要 整行的行级锁。考虑将 JSON 文档限制为 可管理的大小,以减少更新之间的锁争用 交易。理想情况下,每个 JSON 文档都应该代表一个原子 业务规则规定的数据不能合理地进一步 细分为可以独立修改的较小基准。

    此外,在检索消息时,您将能够过滤要检索的消息数量和时间。 (WHERE created_time > 'yyyy-mm-dd' ORDER BY id DESC LIMIT 20)等等。使用 postgres JSON 运算符可以实现一些相同的效果,但速度自然无法比拟。

    基本上,关系数据库优于文本 blob 的原因有很多,我认为您不想忽略这些原因。

    根据mu is too shortmu is too short下面的 cmets 中的课程编辑

    【讨论】:

    • 但是你会说这种类型优于规范化数据结构吗?它用于存储 JSON,您可能不知道对象的结构,或者可能对检索和搜索的速度没有要求。我看不出在这种情况下使用它的任何理由,因为他已经知道他想要存储的数据的结构。
    • 但是,我认为你在这里提到类型很好 - 它可能对 OP 有用。我们可能不知道整个案子。很高兴知道所有选项。 +1
    猜你喜欢
    • 2016-12-10
    • 2012-01-11
    • 2019-03-02
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    相关资源
    最近更新 更多