Django这是在db中存储讨论的正确方法吗?

时间:2017-06-21 19:58:20

标签: python django postgresql

我使用django 1.11和postgresql作为数据库。我知道如何存储和检索数据库中的数据,但我找不到一个示例,它是存储和检索两个用户的整个讨论的正确方法。

这是我的简单想法:
两个用户连接到127.0.0.1,在此页面中有一个文本区域表单。两个用户都可以写入文本区域,并按下按钮发布他们的内容。该页面将重新加载,现在正在显示所有消息。

我想知道的是,如果存储和检索的正确方法是:

one db row => single message user

如果两个用户交换,比如15个消息,它将存储15行并进行单一讨论,我可以将另一列放入db中,类似于讨论“id”,因此15行将具有相同的id和用户:

db row1 ---> "pk=1, message=hello there, user=Mike, id=45")  
db row2 ---> "pk=2, message=hello world, user=Jessy, id=45")

当django中的页面重新加载时会运行:

discussion = Discussion.objects.all().filter(id=45)

检索讨论。

只有两个用户可以私下讨论,所以每两个用户都有一个讨论页面,如127.0.0.1/one,127.0.0.1/two等等。

如果这是从db存储和检索的正确方法,我的问题是如何扩展?我是否可以依靠该设计有效地存储和检索数据库中的数据,或者在不久的将来会很重?我担心1000个用户可以快速增长到10000行。

2 个答案:

答案 0 :(得分:1)

三项建议:

  1. 如果你给PostgreSQL一个相当数量的资源(比如说,亚马逊m3.large实例),那么"很多行"对于PostgreSQL数据库大约有1亿行(取决于)。这不是一个限制,它只是足够的行,你不得不花一些时间来处理性能。因此,假设聊天平均100条消息,则那将是100万条对话。因此,每条消息占一行不是您所谈论的规模的性能问题。
  2. 不要使用数字PK作为订购对话的主要方式(你可能还有一个,Django喜欢有一个)。 有一个timestamptz列,这就是重建会话顺序的方式。
  3. 在用户,timestamptz上有一个唯一索引(因为用户不能同时发布两条消息),还有另一个关于会话的唯一索引timestamptz(这将允许您快速重建会话)。
  4. 您还应该有一个名为"对话"它总结了conversation_id,用户列表,因为这样可以轻松回答请求并向我展示我的所有对话"。
  5. 这会回答你的问题吗?

答案 1 :(得分:1)

因此,您的问题的答案取决于您计划将来如何使用数据以及您需要如何处理数据。完全可以将诸如Postgres之类的列式数据库中的N个用户之间的整个会话存储为每个消息的单独记录。但是,与所有编程问题一样,有多种范例可以回答您的问题。我将在这里探讨其中几个人的利弊(知道肯定会有更多)。

范例1 每条消息的新记录(行)

优点:

  1. 更简单地查询单个消息
  2. 分析功能可以很容易地应用于消息级别(即某些用户对消息的总和)
  3. 记录大小(相对)小
  4. 缺点:

    1. 非常长的桌子尺寸
    2. 随着表格的增长,搜索变得非常耗时。
    3. 集合所需的后处理(即会话中的所有记录)
    4. 更多工作转移到服务器
    5. 范例2 每次对话的新记录(行)

      优点:

      1. 更简单地查询个人对话
      2. 缩小表格大小
      3. 对象所需的后处理(即整个会话存储为JSON对象)
      4. 缺点:

        1. 根据消息的数量和大小,可以大幅增加行的大小。
        2. 更难以查询消息中的单个消息或文本(需要使用更昂贵的函数,例如文本blob上的LIKE%=慢)
        3. 不利于在消息上执行任何类型的分析功能。
        4. 消息成为附加练习
        5. 更多工作转移到客户端/应用程序
        6. 哪个最好? YMMV

          同样,您可能有六种以上的方式存储应用程序的消息,这些都取决于您的下游需求。另外,我想让你看看专门从事消息发布的Apache Kafka等项目可能是一个可扩展的解决方案。