amazons dynamoDb对系统评论有好处

时间:2013-10-28 05:10:00

标签: sql amazon-web-services nosql amazon-dynamodb

我决定使用MySql或NoSQL作为forumn网站。我对整个NoSQL想法都很陌生并阅读文档我注意到'item'不能大于64kb,这包括属性和值。从我理解的方式来看,我能想到实现这一点的唯一方法就是这样:

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

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

2 个答案:

答案 0 :(得分:3)

你可以用很多方式对它进行建模,我能想到的最好的两个是:

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

    发布

    HASH -> <uuid>
    RANGE -> 0
    

    注释

    HASH -> <uuid of the post>
    RANGE -> 1..n (comments will be ordered by RANGE Key by default)
    

    现在querying使用哈希您可以获得帖子及其所有评论。因为它们具有不同的范围,所以它们是不同的项目,因此您可以拥有所需的注释数量。

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

      

    非索引表没有实际限制。

         

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

  2. 使用2个表格

    表格

        HASH -> uuid
    

    表评论

        HASH -> 
        RANGE -> comment date (so you get results ordered by date)
    

    这两种方法的区别在于,第一种方法是1 Query 只指定哈希的操作,你得到你的帖子和所有评论。 (只要整个事情都是<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 checkout:https://github.com/aaaristo/dyngodb

答案 1 :(得分:0)

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

您可以做的是创建一个帖子表和评论表。

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

例如,如果您对评论有评分,则可以在Post表中使用热门评论哈希值,并且只根据需要从评论表中获取“所有评论”。

最后说明,我认为在SQL中设置帖子/评论系统比较容易(检查PostgreSQL,不要局限于MySQL)。它功能强大,效果很好,WordPress正在使用MySQL,为什么不是你......