为具有关系的分层内容选择啥数据库?
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。我仍然坚持我的建议,但祝你好运!以上是关于为具有关系的分层内容选择啥数据库?的主要内容,如果未能解决你的问题,请参考以下文章