2012-07-25 55 views
0

我们现在选择一个项目的数据库。候选人是mongodb和postgres。我们的用户需要定义条件逻辑,例如用户定义条件(如字符串)“x发生”,“Y离开”等,然后可以将它们连接到条件“如果x发生AND(y离开OR z来)......”。mongodb与postgres:建模条件

在单个json文档中做它似乎比关系数据库更可读。

你看到任何方式来合理地在postgres中建模吗?我知道postgres 9.2会支持json,但查询功能似乎很笨重。

在mongo中,动词(“x happen”)将在条件之间重复。动词更新会影响多行。你在这里看到问题吗?

编辑:蒙戈文件可能是这样的:

{ 
    "where": 
    [1,"x happens"], 
    "and": 
    { "where": 
      [2,"y leaves"], 
       "or": 
      [3,"z comes"] 
    } 
} 
+1

关于MongoDB中;你能提供一个示例文档布局和可能的查询吗?描述很难形象化。 – Sammaye 2012-07-25 11:24:49

+0

@Sammaye - 添加 – 2012-07-25 13:06:24

+0

您可以添加一个您的要求用于查询此数据的示例吗? – Ross 2012-07-25 15:19:56

回答

0

好吧,在这方面的PostgreSQL和MongoDB会是相当不同的,你怎么也得想想这又相当类似。最重要的是摆脱严格的关系理念。您的选择是对象关系或面向文档的。我会选择前者,因为我对它更加舒适。

关键是你必须能够将你的条件减少到可以在飞行中定义的布尔值。如果你在PostgreSQL中这样做,你将会有一些编程工作要做。权衡是你得到临时报告,这在MongoDB中会很痛苦。

您可以在Postgres中做的关键是模型衍生数据。因此,PostgreSQL中的关键在于使用表方法在运行时检查约束。要创建一个表法PostgreSQL中使用这样的形式:

CREATE OR REPLACE FUNCTION method_name(table_name) RETURNS return_type .... 

您可能会发现更多的例子这是很有帮助的:http://ledgersmbdev.blogspot.com/2012/08/postgresql-or-modelling-part-2-intro-to.html(是的,这是我的博客)。

事实是,你可以在PostgreSQL上构建一些非常复杂的准关系模型,所以我不会在这方面排除它。问题在于,您是否需要关系方面来进行临时查询和通过对象集合进行报告。如果你这样做,那么Mongo一个人不会削减它,你可以从Mongo导出到Postgres或在PostgreSQL中执行。

这并不是说PostgreSQL就是答案。如果你永远不需要添加新的查询类型,也许Mongo更好。然而,这是您真正想要使用每个高级功能的情况之一,如果您要使用该路线,Pg为您提供了有用的高级功能。

0

除了“关系与记录”问题之外,值得指出的是您将使用JSON。传统上听起来像是mongo的任务。
但是!自Postgre 9.2(最近发布PostgreSQL 10)以来,数据库的NoSQL特性略有增强,这对于使用关系数据来说是非常好的选择。由于您的程序逻辑非常适合两种模式,因此PostgreSQL是处理关系数据和JSON数据的理想选择。

这里是一个很好article上的Postgres对比的MongoDB比较用于存储JSON数据