2012-09-02 46 views
2

嗨我是新手來mongodb.I使用java。Mongodb數據庫模式共享數據設計

我有4個表租客,系統,授權在我的關係表。

就是這樣。

Table   Fields 

Tenant   Tenant_ID(PK), Tenant_INFO 
System   System_ID(PK), System_Info 
Authorization System_ID, Autho_Info. 
System_prop  System_ID, Prop_Info, Tenant_ID 

在System_prop表,Tenant_ID指租客表Tenant_ID(PK),SYSTEM_ID指系統表SYSTEM_ID。

在授權表,SYSTEM_ID是指系統TABEL SYSTEM_ID

我從關係到MongoDB的轉換我的數據庫。我需要做的第一件事是架構設計。

查詢我需要做的是:

  1. SELECT A.Prop_Info,A.System_ID從System_prop A,系統B,TENANT C其中A.System_ID = B.System_ID AND A.Tenant_ID = C. Tenant_ID

  2. SELECT A.System_ID,A.Prop_Info FROM Authoization A,系統B WHERE A.System_ID = B.System_ID

誰能幫我如何設計這些表在旺角收藏ODB?

我需要嵌入r使用dbref嗎?幫助我爲此設計模式。

+1

,你想出要在很大程度上取決於您希望如何查詢數據,因此不知道您打算如何使用這些數據,這將是很難爲別人提供輸入 –

+0

的數據結構將要執行此查詢SELECT A.Prop_Info,A.System_ID從System_prop A,SYSTEM B,TENANT C其中A.System_ID = B.System_ID AND A.Tenant_ID = C.Tenant_ID。 – Ramya

回答

2

你的挑戰來自這樣一個事實,即Prop_Info必須由兩個查詢檢索。這使得很難找出它應該生活在哪個Mongo集合中。

在MongoDB中,您創建文檔模式的理想目標是讓單個文檔擁有您需要的所有信息,併爲您提供查詢模式。在你需要有相同的數據D(如Prop_Info你的情況)通過對兩個單獨集合AB兩個單獨的查詢返回的情況下,您有以下三種策略之間做出選擇:

  1. AB的文檔中複製D,並強制與您的代碼保持一致。這通常是高性能系統的設計選擇,它希望消除對第二個查詢的需求,即使這樣做是以犧牲插入/更新方面的額外代碼複雜性爲代價的,並且由於Mongo不是ACID而存在一些潛在的一致性問題。

  2. DA和存儲在B參考(DBREF或識別領域的一些其他組合),這樣你可以將它與第二個查詢。當A的查詢次數超過對B的查詢次數時,這通常是設計選擇。它將D保存在更頻繁查詢的集合中。在此模式設計模式中,只需在查詢B時進行第二個查詢。

  3. D在一個新的集合C和來自AB進行第二次查詢到它。這通常是在面臨非常不確定的未來要求時的設計選擇,因爲如果與上述(1)或(2)一起使用,不清楚什麼是折衷。它是最「類似關係」的模式,當您查詢AB時,將強制您進行第二個查詢。

您選擇哪種策略取決於您的域名,查詢模式,你從你的對象關係映射(ORM)框架得到(如果你使用一個)的支持,以及最後但並非最不重要的,你的喜好。

在我遇到的情況下,我從未選擇(3)。我在高性能的情況下(分析系統)使用了(1)。我在其他地方使用過(2),因爲查詢訪問模式使「共享」數據應該存活的地方變得明顯。

一旦你選擇了你的策略,如果你仍然需要幫助,發佈另一個SO問題,專門關注模式設計問題。

三個最後提示:

  1. 如果D有關係多重大於1對使用陣列的共享數據。您可以索引整個數組,並且可以使用$elemMatch精確查詢數組內部。

  2. 要在策略(1)或(2)中更新D,請使用MongoDB的atomic modifier operations,其中許多設計用於對數組進行操作。

  3. This SO question涵蓋@Stennie答案中的DBRef兩種查詢模式。 (@Stennie適用於10gen,MongoDB的標記)

祝你好運!

1

你還在思考關係數據庫。然而,MongoDB是一個面向文檔的數據庫。

  1. 人工ID號碼通常是不需要的,因爲每個文件自動有一個_id字段,這是一個GUID(保證是全局唯一的)。
  2. 關係表不應該在MongoDB中使用。 n型關係是用數組字段替代的。所以當1個系統有N個授權使用時,你的系統文件應該有一個字段「授權」,它是它擁有授權的對象ID的數組。是的,那將違背關係數據庫的規範化規則。但是這裏沒有關係數據庫。在MongoDB中,用數組表示N關係是可行的,因爲數組對查詢語言是透明的。
2

您可能只需要一個包含所有文檔的集合,當然最終會由於擁有太多重複的字段而導致這種情況,但這是可以很好地擴展的技巧。 對於一對多和一對一的關係,您只需刪除標識符並放置其餘屬性,因爲MongoDB會照顧主鍵。 ('我喜歡MongoDB')。

對於Tenant和System之間的多對多關係,您必須將其更改爲MongoDB數據結構中的數組。

coll{ 
Tenant : 'value', 
tenant_info : 'value', 
Sys_info: 'value' , 
auth_info: 'value' , 
Prop_info : array [ 'value','value',''value....] 
}