亚马逊 dynamoDb 是否适合像系统这样的评论

use*_*127 3 sql amazon-web-services nosql amazon-dynamodb

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

Posts: [
    { user: 'gates', text: 'first post'
      comment: [
        { user: 'jim', text: 'comment1',
          user: 'bobby', text:'comment2'
         }
      ]
    },
    { user: 'jim', text: 'second post' }
  ]
Run Code Online (Sandbox Code Playgroud)

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

aaa*_*sto 5

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

  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 Query 操作仅指定散列,然后将帖子与所有评论放在一起。(只要整个内容小于 1MB,那么您必须通过另一个 api 调用获得下一个 1MB,依此类推)。而使用第二种方法,您需要对帖子执行 1 个GetItem操作,对评论执行 1个查询操作。由于您只有 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