4

我决定将 MySql 或 NoSQL 用于论坛站点。我对整个 NoSQL 想法非常陌生,阅读文档时我注意到“项目”不能大于 64kb,这包括属性和值。从我理解的方式来看,我能想到实现它的唯一方法是这样的:

Posts: [
    { user: 'gates', text: 'first post'
      comment: [
        { user: 'jim', text: 'comment1',
          user: 'bobby', text:'comment2'
         }
      ]
    },
    { user: 'jim', text: 'second post' }
  ]

这里的问题是,如果一个帖子有很多评论,它会超过该项目的 64kb 限制。是否有另一种实现这种“发布/评论关系”的方法可以很好地扩展?

4

2 回答 2

6

您可以通过多种方式对其进行建模,我能想到的最好的两种方式是:

  1. 使用一张表(比如说“forumapp”):

    邮政

    哈希 -> <uuid>
    范围 -> 0
    

    评论

    HASH -> <帖子的uuid>
    RANGE -> 1..n(默认情况下,评论将按 RANGE Key 排序)
    

    现在使用哈希查询,您可以获得帖子及其所有评论。因为它们有不同的范围,所以它们是不同的项目,所以你可以有多少你想要的评论。

    http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Limits.html

    对非索引表没有实际限制。

    对于具有本地二级索引的表,项目集合大小有限制:对于每个不同的哈希键值,所有表和索引项目的总大小不能超过 10 GB。根据您的项目大小,这可能会限制每个哈希值的范围键数量。有关详细信息,请参阅项目集合大小限制

  2. 使用 2 张桌子

    桌柱

        哈希 -> uuid
    

    表注释

        哈希->
        RANGE -> 评论日期(所以你得到按日期排序的结果)
    

    这两种方法之间的区别在于,第一种方法是您发出 1查询 操作,仅指定哈希值,然后您将帖子与所有评论放在一起。(只要整个内容小于 1MB,那么您必须通过另一个 api 调用获得下一个 1MB,依此类推)。而使用第二种方法时,您需要对帖子执行 1 个GetItem操作,对评论执行 1 个Query操作。由于您只有 5 个二级索引可用于 1 个表,因此您可能需要 2 个表。但通常这实际上取决于您认为您的应用程序将对数据执行的访问...

    为了更好地理解 SQL 和 NoSQL 之间的差异,值得花时间检查一下 Martin Fowler 的演示文稿:https ://www.youtube.com/watch?v=qI_g07C_Q5I

    如果您习惯使用 SQL,那么让应用程序在 NoSQL 数据库上运行可能会很棘手,因为您必须在存储数据之前认真考虑如何检索数据,否则您将根本无法将其读取为你喜欢(没有 SQL 可以拯救..)。有时您必须在单独的表中构建自己的索引,放慢一点写入速度以加快读取速度。即使使用 SQL 数据库,您也应该这样做,但是如果您无法对关系模型进行建模,那么您最多只会得到一个缓慢的应用程序,如果您无法对 NoSQL 模型进行建模,您就会陷入困境。

    例如,如果您必须通过单个查询操作检索所有已标记有标签 A 和标签 B 的帖子,您将必须在另一个表中维护某种索引,给定在 A+B 上计算的哈希将给出与您的查询匹配的所有范围(帖子标识符)。您可能正在考虑二级索引,但您只能在哈希值内使用它们。因此,您首先给出哈希值,然后才使用二级索引进行过滤...

    如果您使用的是 nodejs 结帐:https ://github.com/aaaristo/dyngodb 。

于 2013-10-28T14:46:04.637 回答
0

如果您正在考虑使用 DynamoDB(它不是文档数据库),则附有评论的帖子“文档”不是一个好的用例。

您可以做的是创建一个 Posts 表和 Comments 表。

为了优化数据库,您需要考虑要问的问题。

例如,如果您对评论进行评分,您可以在 Post 表中拥有最热门的评论哈希,并且仅按需从 Comments 表中获取“所有评论”。

最后一点,我认为在 SQL 中设置发布/评论系统更容易(检查 PostgreSQL,不要将自己局限于 MySQL)。它很强大,它会很好用,WordPress 正在使用 MySQL,你为什么不......

于 2013-10-28T07:53:39.553 回答