2013-01-05 39 views
3

MongoDB的短IDS我想有一個友好的面向IDS(即的Youtube風格:/職位/ cxB6Ey6)比MongoDB的對象ID。戰略,創建規模

我讀的可擴展性最好離開_id作爲對象ID,所以我想到了兩個解決方案:

1)索引的帖子ID字段添加到每個文檔

2)之間創建_id的映射集合並且在這兩種情況下使用類似https://github.com/dylang/shortid的東西來生成短ID,並且在生成時通過查詢數據庫來確保ID是唯一的。 (可在此查詢生成,插入是一個原子操作?)

將這些解決方案對性能產生顯着影響?

這樣做的最佳策略是什麼?

+0

我不認爲有人去閱讀第一篇文章中建議的shortid代碼(https://github.com/dylang/shortid),這是一個唯一的標識符,只要您在縮放時管理主機標識符。我會按照專家的意見,不要搞亂原始的ObjectID,並且根據Sammaye的回答,將其放入一個新的字段(例如PostID)中。 –

回答

5

這樣做的通常方法是將Base64編碼,一個唯一的ID,但是:

索引字段帖子ID添加到您一定要去這種方法每個文檔

。在這兩個中,我會說這個方法是最具擴展性和高性能的,因爲它只需要一次往返就可以獲得一個簡短的URLs細節,而第二個選項將花費2秒。另一個考慮是缺少索引開銷維持一個額外的收藏品,這是一個沒有道理的。

我不會替換文檔中的_id字段,因爲默認的ObjectId在可預見的未來仍然有用。

因此,這將其限制爲URL的短代碼的單獨字段和索引(唯一鍵)。

接下來就是你不需要一個ID,它迫使你在每次插入之前查詢數據庫的唯一性。這是ObjectId閃耀的地方。 ObjectId擅長在客戶端應用程序中創建,同時在數據庫中是唯一的,而不必專門查詢這些假設。

不需要首先查詢數據庫的唯一ID通常是基於時間的。在PHP(http://php.net/manual/en/function.uniqid.php)和MongoDB驅動程序(http://docs.mongodb.org/manual/core/object-id/)中,甚至是在github上鍊接的插件(https://github.com/dylang/shortid/blob/master/lib/shortid.js#L50),它們都將時間用作唯一的基礎。

考慮到你鏈接的插件沒有查詢數據庫來檢查自己的ID唯一性我會說,這個插件可能是相當高性能的,如果你使用它與第一個解決方案,你說你應該得到一個好以此爲基準。

3

如果您想自定義的用戶友好的短ID的更換內置的ObjectID然後再去做。您可以使用內置_id字段,也可以爲自定義ID添加新的唯一索引字段id。使用內置的ObjectID的好處在於,即使數據庫非常大,它們也不會重複。所以,用短ID代替它會帶來身份重複的風險。

現在關於性能。我認爲最好的解決方案不是查詢DB的ID,因爲通過適當調整id長度,重複的可能性非常小。因此,在這個模型中處理id重複的最好方法是檢查Mongo響應。如果它回答「重複鍵錯誤」,那麼你應該生成一個新的。

現在關於縮放。要縮放您的自定義ID,您只需添加幾個符號即可。 「重複鍵錯誤」應該是進行這種改變的觸發器。通常不會有這樣的錯誤。所以,如果他們開始出現,那麼它的時間就是規模。

1

我不認爲這對_id場產生ObjectId直接影響到可擴展性和性能。這可能會發生?

主要區別是的ObjectID由MongoDB的創建和你自己做不負擔的這個責任。否則,您必須親自確定ID的最佳大小並確保集合中存儲的每個文檔的每個_id字段具有唯一值。這是必需的,因爲_id用作主鍵。如果你沒有非常大的收集並且你需要標識符的自定義值,這可以證明是合理的。

但你有_id這個字段存儲ObjectId值的機會,從時間創建對象ID的機會,並利用這個事實在查詢中佔據優勢。您也可以使用getTimestamp()方法獲取ObjectId創建的時間戳。在這種情況下排序_id相當於按創建時間排序。

但是,如果你要在URL或HTML使用的ObjectId那麼對於安全問題,你可以對它進行加密。防止信息泄漏和訪問對象的創建時間。這可能是安全風險。

關於您的解決方案:

1)我想這是非常方便和靈活的解決方案。在這種情況下,您可以指定postId中的任何值,該值不直接取決於_id

但這個解決方案的小缺點是你必須有額外的領域,並創建額外的索引。而_id被自動編入索引。

2)從noSQL方法的性能和哲學角度來看,我認爲這不是一個好的解決方案。