gpt4 book ai didi

couchdb - couchdb 中的唯一约束

转载 作者:行者123 更新时间:2023-12-03 10:11:55 29 4
gpt4 key购买 nike

是否有任何技术/建议来强制执行独特的约束?是的,我们可以创建唯一的 key ,但我们不能更改 key 和 key ,而且这种方法不适合复杂的验证(单独的唯一登录、单独的唯一电子邮件等...)

例如,一个帐户应该有
唯一的登录名和电子邮件。导出 key
从这个领域将导致
不一致:

key1: "Account-john@example.net-john", { email: "john@example.net", login: "john"}
key2: "Account-mary@example.net-mary", { email: "mary@example.net", login: "mary"}

看起来不错,但是:
key1: "Account-john@example.net-mary", { email: "john@example.net", login: "mary"}
key2: "Account-mary@example.net-mary", { email: "mary@example.net", login: "mary"}

糟糕,现在我们有 2 个登录帐户:“mary”

最佳答案

这是 CouchDB 中不太有趣的部分之一。我发现处理可以更改的唯一字段的最佳方法(例如在您的用户示例中)是创建“指针”文档,将唯一值作为键的一个组成部分,然后使用它们来声明唯一值。这样做的重要部分是为主文档设置一个可预测的键,然后在保存主文档之前保存唯一字段声明文档(并让键冲突阻止主文档的保存)。

给定具有唯一用户名和唯一电子邮件的用户,您的主要文档可能如下所示:

user-1234: { username: "kurt", email: "kurt@localhost" }
user-9876: { username: "petunia", email: "pie@crust.com" }

唯一字段指针看起来像这样:
user-username-kurt: { primary_doc: "user-1234" }
user-email-kurt@localhost: { primary_doc: "user-1234" }
user-username-petunia: { primary_doc: "user-9876" }
user-email-pie@crust.com: { primary_doc: "user-9876" }

创建或更新用户将采取以下步骤:
  • 准备您的用户文档,必要时为其生成 key
  • 为每个更改的唯一字段保存一个“指针”文档
  • 如果保存其中任何一个失败,请停止并修复错误
  • 保存主用户文档

  • 第 3 步需要一些思考。例如,您不想尝试为未更改的字段声明唯一值。您可以,但是您必须添加一些额外的逻辑来处理您为已经拥有该值的用户声明一个值的情况。

    第 3 步也是让人们采用旧的声明值的好地方。例如,如果一个用户“释放”了用户名 kurt,我可以在验证它不再使用后更新该特定文档以指向我的新 key 。另一种方法是在更改时清除声明的唯一值。我不确定哪个会减少工作量,真的。保留陈旧的声明值对我来说最有意义。

    这个解决方案的有趣之处在于,一旦创建了这些指针文档,您就不需要将它们用于任何内容。您可以在您的用户文档上正常创建 View ,并使用它们通过电子邮件或用户名进行查询。

    此设置还允许您建立关系而不必担心级联用户 key 。我不了解你,但我的用户文档几乎被系统中的所有其他文档引用。更改用户 key 将是一个巨大的痛苦。

    关于couchdb - couchdb 中的唯一约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1541239/

    29 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com