【问题标题】:Equivalent of an ORM for a distributed key/value store?相当于分布式键/值存储的 ORM?
【发布时间】:2011-04-11 18:55:42
【问题描述】:

我正在评估如何在后端使用分布式键/值存储来实现某些东西。我希望在键/值之上有一个层,以支持类似于我从对象关系映射器中获得的对象模型。

谁能指出其他人这样做的任何例子?我主要是在寻找设计理念,但如果我遇到任何我足够喜欢的东西,我可能会直接使用它而不是自己编写。我可能最终会在 Riak 之上用 Perl 实现我的,但这些决定不是最终的。

【问题讨论】:

    标签: orm nosql riak


    【解决方案1】:

    我们之前使用 Riak 做类似的事情,使用 Ruby 客户端 Ripple,它公开了一个 AciveModel 接口。但是,我确实必须反对它(就像其他人一样)。在键/值存储之上使用繁重的 ORM,您确实会失去它的主要优势,即速度。

    我们现在正朝着跳过 Ripple 并直接与 Riak 交谈的方向发展,以解决很多速度意识的问题(我们也在转向 Erlang 并使用 PBC 而不是 HTTP 接口,但这是另一个故事 :D),这就是我们的方式这样做:

    • 在我们的对象中,我们以 Ripple 兼容格式存储 JSON 文档。虽然我们有这个要求,因为我们仍然在某些事情上使用 Ripple,但如果我在没有 Ripple 的情况下再次这样做,我可能仍然会使用这种格式。

    • 使用 Riak 链接将对象连接在一起,不要在文档本身中存储外键。请注意,您可以在对象上存储的链接数量是有限的,因此不要对它们过于疯狂(例如,存储指向用户对象上每个评论的链接)。

    • Ripple(和 Riak)不支持索引,因此我们不得不推出自己的解决方案。作为一个例子,我们在“users”存储桶中存储一个带有随机生成密钥“fen2nf4j9fecd”的用户对象。我们还在 'users_index_by_username' 存储桶中存储了一个带有键 'tom' 的对象,并带有指向 'users' 存储桶中对象的 Riak 链接。这样我们就可以轻松找到用户名为“tom”的用户。

    您可能还想研究使用key filtering。我还没有玩过它,但是我看到了看起来相当不错的性能数据。您需要注意 Riak 不要列出存储桶的键,因为它的实现方式是,Riak 搜索所有键,而不仅仅是该存储桶的键。

    Riak 是一头野兽,但是一旦你开始了解它,你就会爱上它。它使复制变得毫不费力,而且“正常工作”。

    【讨论】:

    • 在我的研究中,我开始意识到许多相同的事情。我知道 Riak Search,但它对我来说有点太测试了。我不知道链接数量的限制,这是很好的信息。我对滚动我们自己的索引也有同样的认识。我仍在试图弄清楚如何避免潜在的竞争条件。
    • 我相信只有在使用 HTTP 接口时才会出现链接数量的限制,因为标头的总大小是有限制的。虽然我不是 100%。我还提到了错误的产品,我指的是密钥过滤,而不是 riak 搜索(已编辑)。
    【解决方案2】:

    你不应该真的需要太多(如果有的话)层。

    为了皮特,它是一个键/值存储,使用您的语言中存在的任何序列化机制来转换您的类型化对象和后端对象。还需要做什么?

    ORM 要复杂得多,因为它们一方面处理关系模型。一个键值存储,嗯,没有。

    【讨论】:

    • 如果您愿意将一个对象和所有可能的子对象存储在一个键/值对中,那会很好,然后您必须为每个请求序列化和反序列化整个怪物。我不同意。如果一个对象引用多个子对象,我希望将各种对象及其关系存储在应保持同步的多个键/值对中。避免重复该逻辑需要建立在键/值存储之上的抽象层。
    • 说什么? “我希望将各种对象及其关系存储在应该保持同步的多个键/值对中”——这就是所谓的关系数据库。不要在 KV No-SQL 存储之上构建 RDBMS,只需使用正确类型的存储引擎即可。
    • 我非常熟悉什么是关系数据库。如果有一个没有指定主数据库的可水平扩展的关系数据库,我会使用它。但是没有,所以我需要在 KV NoSQL 存储之上创建我想要的对象模型。
    猜你喜欢
    • 1970-01-01
    • 2011-05-05
    • 2015-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-20
    相关资源
    最近更新 更多