如何在CouchDB中实现唯一的密钥约束



我使用couchdb,我希望所有用户都有唯一的电子邮件。我希望当我尝试复制电子邮件时,数据库返回状态400(不良请求)。

,由于无法在Couchdb中定义约束,我应该自己实施,我的问题是:

在我的应用程序的哪一层中应该站立?

(1)域对象图层
我真的不知道如何在此层中实施

(2)互动层
由于有业务规则所在的地方,因此可以在此处的交互者中实现此约束。但是,如果单个文档有多个规则,则可能会增加不必要的复杂性...

function createUser(userData)  {
  let email = userData.email;
  let exist = await userDB.userExist(email);
  if(exist) {
    // return status 400
  } else {
    // create user
  }    
}

(3)数据库网关层
约束也可以在数据库网关层中实现。通常,我们将为每个特定实体都有一个门户。但这是否意味着外部服务适配器包含一些业务逻辑?

class userDB()  {
  constructor(opts) {
    this.db = opts.db.connect();
  }
  async userExist(email) {
    return await this.db.fetchByView('email', email);
  }
  async create(email) {
    let exist = await this.userExist(data.email);
    if(exist) {
      // throw error
    } else {
      // create the user
    }
  }
}

Unique email address是一个非常旧的DDD主题。它与设定验证有关。最简单的(从我的角度来看也是最好的)是在数据库级别上放置约束。

据我所知,在CouchDB中创建唯一约束的唯一whay是使用_id字段,以便您可以使用此解决方案。这个想法是将电子邮件放在_id字段中。

让存在=等待this.userexist(data.email);

如果(存在){// 错误} else {//创建用户}

此方法对于并发更新不安全。可以同时创建两个用户。想象一下,对于两个请求,this.userExist(data.email)都返回false。

我不是couchdb专家,但从纯净的架构角度来看,确保独特的电子邮件地址是一项业务规则,应在交互者中实施。

使用这种方法,您的业务规则即使您曾经决定用其他细节来替换细节couchdb -eather -decording System。

最新更新