【问题标题】:C# - Generate "identity" like Id's with NoSQL (MongoDB)?C# - 使用 NoSQL (MongoDB) 生成像 Id 一样的“身份”?
【发布时间】:2011-07-28 06:53:09
【问题描述】:

我一直在使用带有 C# 的 MongoDB,并且一直在使用 ObjectId,然后是后来的 GUID 用于我的实体 Id。我讨厌看这些 ID,我认为它是反直觉的……我真的很希望能够使用整数或长整数,比如关系 DB 身份列。但我很难找到一种方法来做到这一点。如果我使用集合 max + 1,那将导致竞争条件。我读过有关使用 Hi-Lo 生成器算法的信息,但它是如何工作的?如果我有 10 个应用服务器运行相同的代码怎么办?这是否意味着每个集合我必须有 10 个 hi lo 身份范围?

如果有人能指点我分享一个 C# 算法,那就太好了!顺便说一句,我见过 RNGCryptoServiceProvider,但这不能保证是唯一的,而且它不是顺序的 int/long 标识。那时我宁愿使用 Hi-Lo...

谢谢, 蒂姆

【问题讨论】:

    标签: c# mongodb unique identity mongodb-.net-driver


    【解决方案1】:

    您可以编写自己的 id 生成器并使用它。 Here 你可以找到方法。但是ObjectId 被设计为在所有分片/副本集中都是唯一的。因此每个分片都可以独立于其他分片生成唯一的 id。在分布式数据库中使用 int id 会遇到很多问题。

    【讨论】:

    【解决方案2】:

    Guids 可能看起来并不漂亮,但它们已经过测试和尝试。

    您可以不遗余力地尝试防止整数序列上的冲突,但最后,我认为您会发现这不值得麻烦。对于随时间变化的分布式环境尤其如此。

    【讨论】:

    • 我已经将答案设置为下面的响应,因为他有一个生成器的链接,但是你们两个都是正确的......我应该回到 Guid 或 ObjectId,不要再想漂亮了关系整数 ID。
    【解决方案3】:

    这是要走的路:github.com/alexjamesbrown/MongDBIntIdGenerator

    【讨论】:

    • 这在并发插入或文档被删除的情况下不起作用。
    猜你喜欢
    • 2012-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 2012-05-20
    • 1970-01-01
    相关资源
    最近更新 更多