7

我正在实现一个基于 sinatra/rails 的门户网站,它最终可能在表/模型之间有很少的 many:many 关系。这是一个单人团队和兼职但现实世界的应用程序。

我与某人讨论了我的实体,并被建议尝试 neo4j。来自真正的“非性感”企业世界,我倾向于使用关系数据库,直到它停止扩展或由于分片等而成为噩梦,然后再考虑其他任何事情。

然而,

  • 我在这个项目中第一次使用 postgres 和 datamapper,它让我花时间快速上手
  • 我只是在尝试一些事情并构建更多用例,因此我必须不断更新我的架构(原型设计想法和来自 beta 版的反馈)。我不必在 neo4j 中执行此操作(更改我的查询除外)
  • 似乎使用 neo4j 设置搜索非常容易。但是 Postgres 也可以进行全文搜索。
  • Postgres 最近宣布支持 json 和 javascript。想知道我是否应该坚持使用 PG 并花更多时间学习 PG(它有一个很好的社区)而不是 neo4j。

寻找 neo4j 更好的用例,尤其是在项目的原型/初始阶段。我知道如果网站增长,我最终可能会拥有多种持久性技术,如 s3、关系 (PG)、mongo 等。

此外,最好了解它在 Rails/Ruby 生态系统中的表现。


更新1:

我得到了很多很好的答案,似乎正确的做法是现在坚持使用 Postgres(尤其是在我部署到 heroku 之后)

然而,无模式的想法很诱人。基本上我正在考虑一种方法,在你有 100-150 个用户之前你不定义数据模型,并且你自己为你的产品找到了一个好的模式(业务用例),而你只是在演示这个概念并得到注册数量有限的反馈。然后可以决定一个模式并从关系开始。

很高兴知道是否有易于使用的模式/较少的持久性选项(基于易于使用/为新用户设置)可能会放弃说缩放等。

4

3 回答 3

9

如果您的数据模型非常混乱,则应考虑使用图形数据库。他们需要表达实体之间高度复杂的关系。为此,它们在数据级别存储关系,而 RDBMS 使用声明性方法。仅当这些关系非常不同时,存储关系才有意义,否则您最终只会一遍又一遍地复制数据,浪费大量空间。要要求关系如此多样化,您必须处理大量数据。这就是图形数据库大放异彩的地方,因为除了进行大量连接之外,它们只需选择一条记录并遵循他的关系。为了支持我的说法:您会注意到 Neo4j 网站上的每个用例都在处理非常复杂的数据。

简而言之,如果您不关心我上面所说的,我认为您应该使用另一种技术。如果这只是关于扩展、无模式或快速启动项目,那么请查看其他 NoSQL 解决方案(更具体地说,面向列或面向文档的数据库)。否则你应该坚持使用 PostgreSQL。就像你说的,你也可以考虑polyglot persistence

关于您的更新,您可能会考虑hStore。我认为它符合您的要求。它是一个 PostgreSQL 模块,也适用于 Heroku。

于 2013-06-07T08:22:58.543 回答
5

我认为我不同意只在数据模型非常复杂时才使用图形数据库。我相信他们也可以处理简单的数据模型/关系。

如果您之前没有使用 Neo4j 或 Postgres 的经验,那么很可能两者都需要相当长的时间才能学好。

挑选时要注意以下几点:

  1. 这不仅仅是针对数据库技术的开发。您还应该考虑部署。部署和扩展 Postgres/Neo4j 有多容易?

  2. 考虑每种技术的社区和工具。Neo4j 是否有像 Postgres 一样的数据映射器?

  3. 考虑到两者之间的数据模型有很大不同。如果您已经可以进行相关性思考,那么我可能会坚持使用 Postgres。如果您使用 Neo4j,您的数据模型会在几个月内犯很多错误。

  4. 随着时间的推移,我学会了尽可能保持简单。与 Neo4j 相比,Postgres 可能是一个无聊的选择,但无聊不会让你夜不能寐。=)

我也从未见过有人提到它,但你也应该看看 Riak ( http://basho.com/riak/ )。它是一个文档数据库,还提供对象之间的关系(链接)。不如图​​数据库成熟,但可以快速连接几个实体。

于 2013-06-07T16:23:01.373 回答
5

最合适的选择取决于您要解决的问题。

如果您只有几个多对多的表,那么关系数据库就可以了。一般来说,关系数据库有更好的 OR-mapper 支持,因为它们更老,并且具有标准化的接口和行列结构。它们也经过了很长时间的改进,因此它们是稳定的,并且针对它们正在做的事情进行了优化。

如果您的问题更多是关于实体之间的连接,特别是如果您需要更远距离的连接,例如“检测周期(未指定长度)”,一些“朋友的朋友喜欢什么”,则图形数据库会更好。当仅限于 SQL 连接时,这样的事情会变得笨拙。在 Neo4j 的情况下,像cypher这样的问题特定语言使这一点更加简洁。不利的一面是,图形数据库和对象之间存在映射器,但并非适用于所有框架和语言。

我最近使用 neo4j 实现了一个系统原型,能够讨论数据的结构和连接,并能够在数据存储中一对一地建模,这非常有用。此外,在数据点之间添加其他连接很容易,neo4j 是一种无模式存储。由于写入性能问题,我们最终切换到 mongodb,但我认为我们不可能同时完成原型。

其他 NoSQL 数据存储(如基于文档、列、键值)也涵盖特定用例。Polyglot 持久性绝对值得关注,因此请保持您对后端的选择与您的业务逻辑合理分离,以便您以后在学习新知识时更改您的技术。

于 2013-06-07T19:41:45.277 回答