开发者社区> 问答> 正文

怎么设计“多对一”在非关系型数据库

现在存文章内容用hash类型:

post:$post_id
    title,
    content
    ...

comment:$comment_id
    content,
    date,
    status

posts:
    $post_id, $comment_id

存了一个hash类型的posts来表示关系,可能是还是没摆脱关系型数据库。

这种“一对多”的模式,如何在redis上更合理……更redis的体现出来.
应该如何设计这里

展开
收起
爵霸 2016-03-09 13:16:32 3055 0
2 条回答
写回答
取消 提交回答
  • 推荐回答:

    NoSQL很少能完整的支持Join功能,所以在NoSQL里一般用denormalized form存储展开后的关系,因此这个关系不再是“多对一”,而是“一对多”。

    你可以用集合类型存储子文档,比如Redis里的list或set,MongoDB里的sub-document等。

    对于NoSQL,有一个简单的原则,就是把有关联的东西放在一起,比如文章和评论,注意,如果有可能,尽量把文章和评论的所有属性包括内容放在一起,而不是只在文章的记录中存储评论的id。

    这样做的好处很明显,你只需要一次读操作就可以获取这篇文章相关的所有数据,无论怎样进行数据切分也不会把文章和它相关的东西分开到不同的物理机,这样可以极大的提高后台的可缩放性。

    当然这样的设计并不总是适合你的应用,比如文章和作者之间的关系也许就没办法完全的denormailize,所以你需要仔细考虑数据展现的方式和流程,来决定到底该如何组织数据。

    总之,NoSQL不是万灵药,它在提供更高的灵活性、可缩放性和性能的同时,也把原来的黑盒数据库简化成了白盒存储引擎,你需要自己在各个因素之间找到最适合的平衡点,这个工作确实需要很多经验和对业务的深入理解。

    当然,如果数据量很小,这都不是事儿。

    官方帮助文档地址:阿里云帮助中心

    更多参考: 阿里云官网(新用户需注册查看),可领上云红包

    2021-07-08 18:17:35
    赞同 展开评论 打赏
  • NoSQL很少能完整的支持Join功能,所以在NoSQL里一般用denormalized form存储展开后的关系,因此这个关系不再是“多对一”,而是“一对多”。

    你可以用集合类型存储子文档,比如Redis里的list或set,MongoDB里的sub-document等。

    对于NoSQL,有一个简单的原则,就是把有关联的东西放在一起,比如文章和评论,注意,如果有可能,尽量把文章和评论的所有属性包括内容放在一起,而不是只在文章的记录中存储评论的id。
    这样做的好处很明显,你只需要一次读操作就可以获取这篇文章相关的所有数据,无论怎样进行数据切分也不会把文章和它相关的东西分开到不同的物理机,这样可以极大的提高后台的可缩放性。
    当然这样的设计并不总是适合你的应用,比如文章和作者之间的关系也许就没办法完全的denormailize,所以你需要仔细考虑数据展现的方式和流程,来决定到底该如何组织数据。

    总之,NoSQL不是万灵药,它在提供更高的灵活性、可缩放性和性能的同时,也把原来的黑盒数据库简化成了白盒存储引擎,你需要自己在各个因素之间找到最适合的平衡点,这个工作确实需要很多经验和对业务的深入理解。

    当然,如果数据量很小,这都不是事儿。

    2019-07-17 18:55:52
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
2022 DTCC-阿里云一站式数据库上云最佳实践 立即下载
云时代的数据库技术趋势 立即下载
超大型金融机构国产数据库全面迁移成功实践 立即下载