2009-11-04 28 views
6

讓我舉個簡單的例子:你有一個訂單和一個購物車。我設想的一種方法是保存訂單文檔和購物車文檔。訂單文件可以有一個稱爲「購物車」的字段,其值是相關購物車文檔的UUID。另一種我能想象得到的方式是使用包含整個購物車關聯數組的「購物車」字段來保存訂單文檔。換句話說,我沒有將購物車明確地保存爲獨立文件,而是將購物車文件嵌入到訂單文件中。在CouchDB中實現外鍵的習慣用法是什麼?

如果我們以後決定購物車應該是持久性的,那麼返回的用戶會發現他的半成品購物車在各個會話期間等着他呢?我想我們可以結合使用這兩種方法,在不完整的情況下保持購物車分離,並在訂單/購買時將其嵌入到訂單文檔中。

這兩種方法都行得通,但我擔心CouchDB沒有外鍵約束;在第一種方法中,購物車文檔可能被刪除,給您一個損壞的數據集。

你如何決定使用哪種方法?這些方法之一對CouchDB更習慣嗎?有沒有我錯過的方法?

我是CouchDB的新手,所以我很難看到具有或多或少規範化結構的優點/缺點。

回答

4

如果另一方面它們不是一對一的,那麼使用複雜鍵可以使用視圖歸類來進行聯接。

function(doc) { 
    if (doc.type == 'order') { 
    emit([doc.cartid, 1], doc); 
    } else if (doc.type == 'cart') { 
    emit([doc.id, 0], doc); 
    } 
} 

該文檔將通過Cartid進行整理,訂單來自購物車之後。您的應用程序代碼可以輕鬆加入此流,您可以使用startkey和endkey通過特定的cartid進行查詢。

查看:View Collation查看排序規則。

您也可以使用reduce將它們連接在一起。

只要改變映射函數將此:

function(doc) { 
    if (doc.type == 'order') { 
    emit([doc.cartid, 1], {cartid: doc.cartid, orders: [doc]}); 
    } else if (doc.type == 'cart') { 
    emit([doc.id, 0], {cartid: doc.id, orders: [], cart: doc); 
    } 
} 

,並添加減少功能是這樣的:

function(keys, values) { 
    var out = {cartid: null, orders: [], cart: null}; 
    for (idx in values) { 
    var doc = values[idx]; 
    out['cartid'] = doc.cartid; 
    if (doc.cart) { out['cart'] = doc.cart }; 
    for (idx2 in doc.orders) { 
     out.orders.push(doc.orders[idx2]); 
    } 
    } 
    return out; 
} 

這將每車返回一個文檔,其中一個cartid,數組訂購文件和購物車文件。

道歉,如果在上面的代碼中有錯誤,但我沒有一個方便的couchdb測試實例來試用它們。您應該瞭解一般想法,並且CouchDB維基有更多詳細信息。

0

如果Order和Cart對象具有一對一的關係(這就是它的聲音),那麼第二種方法最有意義......只是將關聯對象保存在一個關係中。這樣可以提供所需的數據完整性並使其變得簡單;-)

相關問題