2014-11-20 57 views
2

瞭解如何在Couchbase中構建文檔之間的關係。也許這個問題更好地用例子來問。設計Couchbase/CouchDB中文檔之間的關係?

假設有酒店和客人。許多酒店和許多客人。建立關係

{ 
    "_id": "hotel1" 
    "type": "hotel" 
    "name": "Hilton" 
    ... 
} 

{ 
    "_id": "hotel2" 
    "type": "hotel" 
    "name": "Hampton" 
    ... 
} 


{ 
    "_id" : "guest1" 
    "type": "guest" 
    "name": "John" 
    ... 
} 
{ 
    "_id" : "guest2" 
    "type": "guest" 
    "name": "Erin" 
    ... 
} 

的方法之一是酒店的文檔中嵌入客人的ID,但是這會隨着時間的推移非常大。

另一種方式是在酒店文檔中嵌入酒店ID併爲每個酒店創建視圖以列出其客人。由於隨着時間的推移添加了酒店,無論何時創建酒店文檔,都需要動態添加這些視圖。如果有500家酒店,他們將獲得500個觀點。

什麼是建立這種數據的關係和檢索旅館的客人數據的更清潔的方式?

+0

我想點Couchdb和Couchbase不是一回事,它們的工作方式也不一樣。 – theMayer 2014-11-23 00:54:15

回答

3

假設Couchbase視圖的工作方式與CouchDB視圖相同。

將賓館ID置於賓客文檔中。只有一個視圖能夠爲訪客訪問的每家酒店發佈一個複雜的密鑰。例如

for (var visit in guest.hotels) { 
    emit([visit.hotel_id, visit.date], guest_id); 
} 

然後,您可以通過查詢與

startkey = ['hotel1'] and endkey = ['hotel1', {}] 

您還可以得到特定日期間的客人名單這樣的觀點得到了酒店的嘉賓名單:

startkey = ['hotel1', date1] and endkey = ['hotel1', date2] 
1

我覺得你的情況,你可以創建一個關係圖文檔:

{ 
    "hotel_id": "hotel1", 
    "guest_id": "guest1" 
} 

那麼它將存儲酒店/ IDS客人。然後,您可以創建2個通用視圖:「ListHotelGuests」和「ListGuestHotels」。根據您的應用業務邏輯,您可以過濾,分組這些視圖。

3

我喜歡在這裏發佈的其他答案;但是,我不相信有足夠的解釋說明這是教育。如果我正確理解你的問題,那麼這個問題試圖克服的設計中有一點缺陷。

您必須指出,在每個Hotel文檔中嵌入客人列表是不可行的。同樣,在訪客文檔中嵌入酒店列表也很麻煩,但不是不切實際。

我是缺少在這裏的事實是,有有住宿需要三個實體:

  1. 酒店
  2. 遊客
  3. 預訂

Reservation實體應包含客人,酒店和特定住宿的任何相關細節。您不能將這些信息放入Hotel或Guest文檔中,因爲您最終會得到的對象太大而不能很好地執行(儘管承認它需要一段時間)。如果有疑問,總是會錯過良好的表現。

與其他答案指出的一樣,創建視圖可以讓酒店和賓館的賓客獲得賓客的意見。