2013-06-20 202 views
0

代表MongoDB文檔的最佳方式是什麼?我把Product作爲Client的子文件。嵌套圖的嵌套VS聚合?

First, i've put them as Aggregation; if the Client is broken, the Product is broken too. Do i use that model, or do i switch to Nesting.

實施例:

Nesting

enter image description here

+1

請包括與數據的實際例子和用於訪問和寫入數據的用例列表。應該選擇你的模型來適應你的用例。請參閱以下內容,以便在MongoDB中進行數據建模:http://docs.mongodb.org/manual/core/data-modeling/ –

+0

@JamesWahlin剛剛更新了它 –

+0

@AbdelouahabPp,仍然沒有實際的文檔展現你的意思。 – Derick

回答

1

從編程的角度(例如,Java):

參考:http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

嵌套類分爲兩類:靜態和非靜態。被聲明爲靜態的嵌套類簡單地稱爲靜態嵌套類。非靜態嵌套類稱爲內部類。

class OuterClass { 
    ... 
    static class StaticNestedClass { 
     ... 
    } 

    class InnerClass { 
     ... 
    } 
    InnerClass innerObject = new InnerClass(); 
} 

OuterClass.StaticNestedClass nestedObject =新OuterClass.StaticNestedClass();

從UML透視:

  1. 類從命名空間概括

    分類 - |> EncapsulatedClassifier-- |> StructuredClassifier-- |> Classifier-- |>命名空間

  2. 命名空間具有「成員」和「擁有成員」。

    /部件:NamedElement [0 .. *]

    /ownedMember:NamedElement [0 .. *]

    的 「構件」 表示 「StaticNestedClass +將InnerClass」;而 「ownedMember」 表示「將InnerClass 「只有

一般建議:

  1. 我不會使用「嵌套」連接器;它會導致「StaticNestedClass」和「InnerClass」之間的混淆。
  2. 我不會使用「聚合」連接器(白色鑽石);因爲它是由遺留原因引入的;
  3. 始終使用「關聯」和「構圖」。

如何做圖表?

  1. 如果你想「StaticNestedClass」的元模型,給它「::在OuterClass StaticNestedClass」作爲類名稱。沒有涉及連接器。
  2. 如果要爲「InnerClass」建模(在UML規範中稱爲「nestedClassifier」), (1)在圖上創建兩個類元素,分別命名爲「OuterClass」和「OuterClass :: InnerClass」。 (2)從「OuterClass」到「OuterClass :: InnerClass」繪製一個「Composition」連接器。

協會或組成

這是真的取決於你的需求。

大多數人喜歡用「毀滅」的過程來描述「構圖」; 「整體」被摧毀,那麼「部分」也被摧毀。

但是,從「構造」過程描述總是有效的;在這個過程中,「新的整體」,你「新的部分」。 這是一個很好的做法,使「構建」和「銷燬」他們一致。

E.g.汽車和車輪;

如果有人寫了下面的代碼瘋狂,哇..

class Car{ 
public: 
    Wheel* w1; 
    Wheel* w2; 
    Car(Wheel* w1_, Wheel* w2_) 
    { 
     w1 = w1_; 
     w2 = w2_; 
    } 
    ~Car() 
    { 
     delete w1; 
     delete w2; 
    } 
} 

Wheel* l1 = new Wheel(); 
Wheel* l2 = new Wheel(); 
Car* myCar = new Car(l1, l2); 
delete myCar; 
l1->Operation1(); //Crash! 

因此,這不是一個真正的「組合」,因爲結構和破壞是不相符的。 如果您從析構函數中刪除了「刪除w1;刪除w2」,則Car和Wheel之間的關係爲「Association」。

的代碼組成的版本將是這樣的:

class Car{ 
public: 
    Wheel* w1; 
    Wheel* w2; 
    Car() 
    { 
     w1 = new Wheel(); 
     w2 = new Wheel(); 
    } 
    ~Car() 
    { 
     delete w1; 
     delete w2; 
    } 
} 
+0

啊謝謝!我用'作文'做了它,所以它看起來更正確 –