我使用CouchDB,并希望所有用户都有唯一的电子邮件地址。我期望当我尝试复制电子邮件时,数据库返回状态400(错误请求)。
但是由于在CouchDB中没有定义约束的方法,所以我应该自己实现它,我的问题是:
这个规则应该在我的应用程序的哪个层次中?
(1)领域对象层 我不知道如何在此层中实现它。
(2)交互器层 可以在此处实现此约束,因为业务规则位于此处。但如果单个文档有多个规则,则可能会增加不必要的复杂性...
但是由于在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
}
}
}