我决定使用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限制。还有另一种实现这种“发布/评论关系”的方法,可以很好地扩展吗?
答案 0 :(得分:3)
你可以用很多方式对它进行建模,我能想到的最好的两个是:
使用一个表(比如说“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个表格
表格
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,为什么不是你......