为具有多个页面标签的评论部分创建数据库

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 加入书签,这对您来说可能是一个有趣的阅读。

以上是关于为具有多个页面标签的评论部分创建数据库的主要内容,如果未能解决你的问题,请参考以下文章

如何打印具有多个数据的标题和uitableview的uiwebview

在 Joomla 中以编程方式创建菜单层次结构

创建具有多个标签的自定义按钮

无法创建具有特定数量的类标签的熊猫数据框

以编程方式创建具有多个标签的 UIView

UITableView 使用 Realm 和 Swift 具有多个按字母顺序排列的部分,多个标签与相同的数据连接