将聊天消息存储在json字段django中好吗?

时间:2019-03-02 19:25:30

标签: sql django postgresql django-models

在我的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字段中存储多少最大大小?

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

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

1 个答案:

答案 0 :(得分:1)

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

postgres中json类型的最大大小是无限的,但是我不认为您想通过大型json dict dump来朝这个方向发展。当该字段增加时,检索它的时间只会增加。最终,您将不得不以某种方式在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运算符可以达到某些相同的效果,但是速度自然无法比拟。

基本上,有很多原因使关系数据库比我不希望忽略的文本斑点更为重要。

根据mu is too short

中以下注释的课程进行了编辑