2013-10-24 79 views
3

讓我們舉個例子來看一篇博客帖子,其中一個獨特的slu is是從帖子的標題sample_blog_post生成的。不要將mongo ObjectId存儲爲_id,比方說將slug存儲在_id中。除了顯而易見的情況,即如果標題改變,slu may可能會發生變化,通過使用字符串而不是數字_id,在性能方面是否存在主要缺點?例如,如果員額數量變得非常大,例如超過100萬,這可能會出現問題。但是,如果帖子數量相對較低,比如說2000年,它會有多大的區別?到目前爲止,關於ObjectId唯一我認爲我會利用的就是免費提供的created_on日期。在mongo中使用slug作爲主鍵/ _id的性能劣勢?

因此,總之,是否值得將slug存儲爲_id而不使用ObjectId?似乎有關於如何將替代值存儲爲_id的討論,但不討論它的性能優勢/劣勢。

回答

3

因此,總而言之,是否值得將slu store存儲爲_id而不是使用ObjectId

在我看來,沒有。性能差異可以忽略不計的大多數情況下(除了尋呼),但

  • 代理主鍵的舊的討論上來。 「slu」子「並不是一個非常自然的關鍵。是的,它必須是獨一無二的,但正如你已經指出的那樣,改變slu should不應該是不可能的。僅此一點不讓我打擾...
  • 有一個單調_id鍵可以節省你從一些煩惱,最重要的是避免昂貴的呼叫通過skiptake(使用上_id代替$lt/$gt)。
  • maximum index length in mongodb的限制是比對 1024個字節的限制。雖然不美觀,但URL可以是a lot longer。如果有人進入了一個更長的slu,,它將不會被發現,因爲它已經從索引中無聲無息地掉下來了。
  • 擁有一致的界面是一個不錯的主意,即在所有或至少大部分對象上使用相同類型的_id。在我的代碼中,我有一個異常,我使用特殊的散列作爲id,因爲值不能改變,集合具有極高的寫入速率,而且它很大。
  • 假設你想鏈接到管理界面中的文章(不是公共站點),你會使用哪個鏈接?通常情況下,id,但現在id和slug是等價的。現在一個簡單的bug(比如允許一個空的段落)很難恢復,因爲用戶甚至不能再去管理界面。
  • 你將會處理字符集問題。我建議甚至不使用slu for查找文章,但slu's的散列

從本質上講,你會落得像

{ "_id" : ObjectId("a237b45..."), // PK 
    "slug" : "mongodb-is-fun", // not indexed 
    "hash" : "5af87c62da34" } // indexed, unique 
+0

,你會在鼻涕蟲用什麼樣的哈希函數的模式?我正在考慮使用像http:// localhost/posts// nini

+2

這樣的網址,我不認爲這很重要。在這種情況下,可以使用簡單的MD5,但可以隨意使用SHA哈希。 URL中的散列沒有多大幫助。或者只使用slug並將其散列用於查找,或者使用'/ posts/id/slug'(如SO),它將id的簡單性(和不變性)與slug的SEO優勢相結合。 – mnemosyn