我使用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。