2016-08-29 5 views
0

Ich bin neu in CouchDB und die NoSQL Szene und kommt aus einem SQL Hintergrund. Ich habe einige Fragen auf referentielle Integrität, zum Beispiel Ich habe ein Produkt Dokument wie untenCouchDB Referentielle Integrität

{ 
    type: "product" 
    name: "Sweet Necklace" 
    category: "necklace" 
} 

Und jeder Kategorie haben ein eigenes Dokument

{ 
    type: "category", 
    name: "necklace", 
    custom_attr: ".." 
} 

Nur um des Arguments, was passiert, wenn die Stakeholder wählte die Kategorie von "Halskette" in "Zubehör" umbenennen, was sollte auf den Produkten geschehen, die das Kategoriefeld als "Halskette" haben? Mache ich ein Massenupdate für alle Produkte mit Kategorie gleich Halskette? (Ich glaube nicht, CouchDB ermöglicht es uns, eine "UPDATE ALL WHERE" Anweisung)

Was ist die beste Praxis für die Behandlung einer solchen Situation?

P/S: Ich wählte den Kategorienamen in dem Produkt Dokument anstelle einer Kategorie-ID zu speichern, da NoSQL Denormalisierung ermutigt sowieso.

Antwort

0

Wenn Sie ein separates Dokument für die Kategorie verwalten, haben Sie Ihre Daten nicht denormalisiert. In der Tat, indem Sie tun, was Sie tun, erhalten Sie das Schlimmste aus beiden Welten - keine Normalisierung und keine Denormalisierung.

versuchen, etwas wie folgt aus:

Produkt Dokument:

{ 
    _id:"product:first_product", 
    name:"First Product" 
    category:"category:category_1" 
} 

Kategorie Dokument:

{ 
    _id:"category:category_1", 
    name:"Category 1", 
    custom_attr: {} 
} 

diese Weise, wenn Sie den Namen der Kategorie zu ändern, sind Sie immer noch mit Bezug zum richtigen Dokument aus allen Produktdokumenten, die diese Kategorie haben.

Hinweis: Sie können immer noch ein type Feld haben und lassen Sie die _id bleiben, wie es derzeit ist.

Edit:

Um das Produkt/Kategorie Informationen zu erhalten, können Sie eine Map-Funktion wie so definieren:

function(doc){ 
    if(doc.id.indexOf('product:') === 0){ 
    // or if(doc.type === 'product') if you use the type field 

    emit(doc, {'_id': doc.category}); 

    } 
} 

Nun, wenn Sie diese Ansicht verwenden, und Sie setzen include_docs auf true, die Kategorieinformationen werden in Ihren Ergebnissen enthalten sein.

+0

Folgen Sie Ihrem Beispiel, wann immer ich den Kategorienamen des Produkts brauche, muss ich noch die Kategorie-Sammlung abfragen, nicht wahr? Ich dachte, dass dies einen der Ziele von NoSQL übertrifft, nämlich die Vermeidung von Joins. –

+0

Nein, Sie müssen keine weitere Anfrage ausführen. Ich habe die Antwort mit einem Beispiel aktualisiert. – Kul

Verwandte Themen