2012-07-25 54 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數據