为具有关系的分层内容选择啥数据库?

Posted

技术标签:

【中文标题】为具有关系的分层内容选择啥数据库?【英文标题】:What database to choose for the hierarchical content with relations?为具有关系的分层内容选择什么数据库? 【发布时间】:2017-05-26 02:27:21 【问题描述】:

我想要一个类似评论的网站,但不仅有评论,还有其他类型的内容。网站的设计结合了层次结构(每个内容对象/记录/实体都有一个父类容器)和关系 - 每个内容对象/记录/实体都有许多相关的其他对象:

内容的作者(即用户) 相关的 cmets(有自己的关系,尤其是作者) 项目正在数据库中作为单独的记录进行审查 图库中的图片

最重要的事情之一是性能。正如我在网上看到的并且已经在其他项目中尝试过的那样,NoSQL 中的关系曾经效率低下。另一方面,一般的设计,除了上面提到的关系之外,还有一个明显的内容库式结构,这正是网站设计对象(文档、文章、评论)的层次排列的准确反映。另外,我真的很喜欢 NoSQL 中记录的松散结构。然而,我不关心(也不使用)诸如版本控制和其他与 NoSQL 相关的事情。

所以我想在一个项目中结合两个 wordls:层次结构和关系,或者实际上是它的模型。除此之外,我希望项目restful,以便移动应用程序可以使用通过 API 提供的相同内容。另一个要求是内容应可搜索

您会为这样的项目选择哪种类型的存储?

【问题讨论】:

这里的反对票是不公平的。人们可能甚至没有读过这个问题!我提供了我所拥有的确切用例,因此它不是太宽泛也不是离题。 这是一个广泛的架构问题,涉及许多领域(数据结构、REST API、搜索),但我认为它仍然是一个有效的问题。在没有给出理由的情况下投反对票是非常无益的。 【参考方案1】:

您可以使用以下方法轻松地在 SQL 中为分层数据结构建模(使用 PostgreSQL):

CREATE TABLE comments (
    id INTEGER,
    parent INTEGER,
    content VARCHAR(1024)
)

其中parent 指的是父评论的id

如果您正在使用公开 RESTful 接口的 NoSQL 数据库,您可以考虑使用CouchDB。 然后,您可以将 CouchDB 复制到 Elasticsearch 以进行更可靠的搜索。

但如果您的数据是关系型的,那么我非常建议您首先考虑使用像 PostgreSQL 这样的 SQL 数据库。

【讨论】:

所以当关系也很重要时,您根本不建议使用 NoSQL DB? PGSQL 中的数组似乎是一个不错的功能(我在 NoSQL 中经常使用它),但我想知道它们在 RDBMS 世界中的实践效果如何——您能否详细说明一下,或者它超出了您的经验范围? 很难说没有特定的用例,但我鼓励先探索 SQL,看看限制在哪里。我的 NoSQL 经验(文档、密钥存储)表明,对项目进行广泛更新(例如整个 JSON 文档)而不是该文档的许多特定部分时会更好。很高兴看到其他问题,如果我有帮助,请将此标记为答案。 我猜,当谈到广泛的更新时,您是指 NoSQL 中嵌入的“关系”?顺便说一句,我准确地描述了我的用例。 按用例我应该说具体的代码,我只是想知道是否有一些未提及的东西使 SQL 不适合。我所说的广泛更新是指一次更新一篇文章和所有 cmets,如果数据分布在多个表中,这将更加困难。您可以考虑 PostgreSQL 中的 JSON 字段类型来获得灵活的数据结构,并且这些字段之间仍然存在关系。如果您想稍后更改结构,也可以使用数据库迁移库来提供帮助。 谢谢。我考虑过 PostreSQL 中的 JSON 字段类型,到目前为止我还没有使用过,但我决定不使用它。 RDBMS 中的 JSON 字段类型很不寻常,它迫使您采用特定的解决方案。此外,它是一个相对较新的添加,具有潜在的风险和不成熟。最重要的是,有可用的专用解决方案专门设计用于处理松散结构,例如 JSON 字段类型。【参考方案2】:

我决定使用 Graph DB。这就是我拒绝其他人的原因:

我不想使用 NoSQL(文档),因为关系很难维护,并且通常需要额外的代码基础架构(通常是自定义)来处理它们,请参见例如Diaspora NoSQL problems 我不想使用 RDBMS,因为基于结构的 DB 施加了众所周知的限制并且不反映域 我拒绝了键值和大表数据库,因为它们有非常具体的用例

图形数据库已在许多面向内容的项目中使用,并且似乎做得非常好。

【讨论】:

出于好奇,能否具体说明您选择了哪个图数据库? *** 有时让我吃惊。到目前为止,我似乎无缘无故地获得了 -6 票,但人们仍然对答案感兴趣。我决定使用 Neo4j。为什么要问? 更新您的答案可能会更有帮助,以防将来有人遇到类似情况。我只是好奇你选择了哪个,但我没有使用过 Neo4j。我仍然坚持我的建议,但祝你好运!

以上是关于为具有关系的分层内容选择啥数据库?的主要内容,如果未能解决你的问题,请参考以下文章

优化分层数据集以读取整个层次结构

数据结构主要学啥内容

GraphQL 解析器为具有关系的对象返回啥?

access建立查询时,啥情况下两表之间要建立关系

举例简要说明啥是聚合关系,掌握聚合关系具有啥样的意义

候选键和主键有啥区别?