【问题标题】:GetOrCreate in RavenDB, or a better alternative?RavenDB 中的 GetOrCreate,还是更好的选择?
【发布时间】:2012-02-27 21:27:18
【问题描述】:

我刚刚开始在个人项目中使用 RavenDB,到目前为止,插入、更新和查询都非常容易实现。但是,我遇到了需要 GetOrCreate 方法的情况,我想知道实现此目的的最佳方法是什么。

具体来说,我正在与 OpenID 集成,一旦进行身份验证,用户就会被重定向到我的网站。此时,我想从 Raven 检索他们的用户记录(通过查询 ClaimsIdentifier 属性)或创建一个新记录。 Raven 正在设置用户 ID。

显然,我可以在两个语句中编写它,但如果没有围绕 select 和 create 的某种事务,我可能最终会在数据库中使用相同的声明标识符获得两个用户记录。

有没有办法实现这种功能?可能更重要的是你认为我走错了路。我假设即使我可以创建一个事务,它也会使扩展到多台服务器变得困难,并且无论如何都会增加性能瓶颈。

更好的方法是将查询和创建操作作为单独的语句,并在检索用户时检查重复项并在此时合并。还是在计划任务上做类似的事情?

我不禁觉得我在这里遗漏了一些明显的东西,所以对于这个问题的任何建议将不胜感激。

注意:虽然扩展至多台服务器对于个人项目来说似乎没有必要,但我在将它用于工作之前将其用作对 Raven 的评估。

【问题讨论】:

    标签: ravendb


    【解决方案1】:

    Dan,虽然 RavenDB 支持事务,但在你的情况下我不会那样做。相反,您可以只使用用户 ClaimsIdentifier 作为用户文档 ID,因为它们被授予唯一性。

    或者,您也可以保留由 Raven (HiLo btw) 生成的用户 ID,并使用新的 UniqueConstraintsBundle,它可以让您将某些属性赋予唯一性。在内部,它将创建一个附加文档,其中包含您的唯一属性的值作为其 id。

    【讨论】:

    • 感谢 Daniel,UniqueConstraintBundle 看起来很有趣,一旦它被拉入主项目,我肯定会尝试使用它。不过,我认为您是对的,在此我可以将claimidentifier 设为ID。干杯
    猜你喜欢
    • 2014-07-23
    • 1970-01-01
    • 2017-10-22
    • 1970-01-01
    • 1970-01-01
    • 2014-01-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多