为具有多个页面标签的评论部分创建数据库
Posted
技术标签:
【中文标题】为具有多个页面标签的评论部分创建数据库【英文标题】:Creating a DB for comment sections with multiple page tags 【发布时间】:2019-11-17 07:58:38 【问题描述】:我很难为这个用例选择正确的数据库(SQL、NoSQL),尽管它很常见。
这是主要记录 -
页面: 包含许多字段(将来可能会更改和更新)。 连接到标签列表(最多可包含 50 个标签)。 连接到评论部分。
使用标签查询页面记录。
一般来说,读取更重要(因此写入可能更昂贵)并且可用性应该很高。
不选择mongodb风格DB的原因是因为comment section,没有join,所以comment section必须嵌入到页面中,文档大小可能会增长过大。 此外,MongoDB 对可用性的依赖程度较低(使用 CAP),可用性对我来说很重要。
之所以不选择SQL是因为Page的scheme可以更新,没有固定的scheme。 也因为标签系统 - 应该创建另一个关系表,据我了解,这对性能不利。
这里最好的方法是什么?
【问题讨论】:
@GordonLinoff 我要求最好的方法,在这个用例中使用 SQL 或 NoSQL @GordonLinoff 如果 OP 有更多关于性能的新内容,他们不会就 SO 提出问题 ;-) 虽然我同意,但这是 SO 的边界,他们要求的是 NoSQL 与关系建议而不是产品意见. 【参考方案1】:看看Postgres,你可以两全其美。
Postgres 支持jsonb,它允许索引 jsonb 数据类型,因此您可以非常有效地执行标签搜索,或者将它们保留为数组数据类型。
如果您担心 cmets 嵌入,则链接到另一个表并从一等公民的连接中受益。
根据您的用例,您可以有一个 Pages 表,其中包含主要的、众所周知的列和一些外键到 Authors 等,标签为数组或 jsonb 列,jsonb 中的一些页面属性和单独的评论中的 cmets具有用户和页面外键的表。
Mongodb 和 Postgres 都是不错的选择。
PS,我在 Mongodb 上构建的内容远远超过 Postgres,但在最近对一个新项目进行评估后,Postgres 给我留下了深刻的印象。
【讨论】:
谢谢!因此,您建议将数组用于也将被索引的标签,而不是创建另一个表.. 缩放怎么样?听说sql的水平缩放很痛苦 @Chev 。 . .这个问题应该被关闭,而不是回答。它要求软件推荐。 @GordonLinoff 这不是软件推荐。我要求最好的方法,在这个用例中使用 SQL 或 NoSQL @Drxxd,我个人会保留文档中嵌入的标签并创建适当的索引 - 除非您预见将来需要本地化标签,这是不太可能的。每页的评论很少,可能不会被搜索,所以它们可以被嵌入,但没有理由你不应该移动到带有外键的 sep 表。在大多数 nosql 产品中,您可以将查询一起批处理以获取 cmets 和页面集合。关系数据库是为加入而构建的,所以请使用它们——只是不要因为深度而疯狂。画出两个产品,为架构建模,批量加载并分析您的用例。 PS,已将此Guardian article on migrating from mongo 加入书签,这对您来说可能是一个有趣的阅读。以上是关于为具有多个页面标签的评论部分创建数据库的主要内容,如果未能解决你的问题,请参考以下文章