2016-03-04 47 views
1

我正試圖找到哪種方法更具可擴展性。 我有一位在拼車旅行中要求座位的用戶,並且用戶需要能夠查看適用於他們的所有行程。我的模型是這樣的:當用戶去查看適用於他們所有的行程這是查詢MongoDB的最佳結構嗎?

var UserSchema = new mongoose.Schema({ 
    id: String, 
    name: String, 
    trips: [String]   // An array of strings, which holds the id of trips 
}); 

var TripSchema = new mongoose.Schema({ 
    id: String, 
    description: String, 
    passengers: [String]  // An array of strings, which holds the id of users 
}); 

所以,我的後端將通過在蒙戈數據庫中的所有車次搜索。 我2個方案之間作出決定:

  1. 搜索通過所有行程和
  2. 搜索通過所有行程相匹配的ID的ID返回的車次,其中用戶的id是乘客數組中,並返回的車次用戶的旅行數組。

我相信方法#2更好,因爲它不必在Trip模型中進行更深入的搜索。我只是尋求確認,並想知道是否還有其他我應該考慮的事情。

回答

1

如果不做大的數據,我只想說,這並不重要 - 兩者都不夠好,但如果你真的有幾百萬的查詢數百萬用戶和旅行...

  • 對於選項1,您只有一個查詢,但您必須確保您已將您的字段passengers編入索引,因此您需要維護另一個索引以便高效。另一個索引影響你的寫作表現。
  • 對於選項2,你總是需要做兩個查詢。 首先查詢用戶集合中的用戶對象,然後執行in樣式查詢以加載與來自user.trips的任何tripIds相匹配的旅行項目。您將在始終編入索引的_id字段上進行查詢。當然,無論如何,當你總是加載你的用戶時,只有一個查詢是真正重要的。

您還需要考慮writeread的性能更重要。您的模型對於write來說相當低效,因爲對於每次新旅行,您都需要更新兩個集合(旅行和用戶)。所以,目前你的寫入增加了一倍,通常寫入比讀取更昂貴。

最後:具有簡單易維護的代碼通常比性能更重要 - >只需使用貓鼬populate功能,並且所有操作都是爲您自動完成的。不要將引用存儲爲字符串,而應將其存儲爲ObjectId類型,並在模型中使用ref keywoard。

+0

太棒了,這正是我所希望的見解!我希望在我的範圍內寫入性能可以忽略不計的讀取改進。我沒有使用貓鼬填充功能,但我肯定會研究它。感謝Reto! :) –

+0

順便說一句。也許是一個很好的閱讀 - 這是來自有史以來最有名的計算機科學家之一:http://c2.com/cgi/wiki?PreviousOptimization – Reto

+0

「不成熟的優化是所有邪惡的根源」哈哈這將是一個很好的讀 –