2011-07-28 30 views
2

我一直在使用MongoDB和C#,並且一直在使用ObjectIds,然後是我的Entity Id的GUID。我討厭看這些Id,我認爲這是違反直覺的......我真的希望能夠使用整數或長整數,如關係數據庫標識列。但我很難找到一種方法來做到這一點。如果我使用收集最大值+ 1,那將導致競爭條件。我已閱讀過有關使用Hi-Lo Generator算法的信息,但這是如何工作的?如果我有10臺應用服務器運行相同的代碼會怎麼樣?這是否意味着每個集合必須有10個喜歡身份範圍?C# - 與NoSQL(MongoDB)一樣生成「身份」像Id的?

如果有人可以指向我一個C#算法來分享,那將非常棒!順便說一下,我已經看到了RNGCryptoServiceProvider,但這並不保證是唯一的,它不是一個順序的int/long標識。我寧願使用高羅在這一點......

感謝, 添

回答

4

你可以編寫自己的id生成器並使用它。 Here你可以找到如何。但是ObjectId被設計爲在所有分片/副本集中是唯一的。所以每個分片都可以獨立於其他人生成唯一的ID。在分佈式數據庫中使用int id,你會遇到很多問題。

+0

我已經在這裏創建了一個實現:https://github.com/alexjamesbrown/MongDBIntIdGenerator - 這是一個正在進行的工作,需要更多的測試等......但這是一個開始 – Alex

1

的GUID可能不漂亮看,但他們進行了測試和嘗試。

你可以盡你所能去嘗試和防止整數序列的衝突,但最終,我認爲你會發現它是不值得的麻煩。對於隨時間而變化的分佈式環境尤其如此。

+0

我有答案設置爲以下響應,因爲他有一個鏈接到發電機,但兩者的你是正確的?我應該回到Guid或ObjectId,並停止考慮漂亮的關係型整數Id。 – Tim

-1

這是路要走:github.com/alexjamesbrown/MongDBIntIdGenerator

+1

這不適用於這種情況併發插入或者文檔是否被刪除。 – JohnnyHK

+0

是的,好點。 – malibeg