我有一个收集和处理用户信息的应用程序。
CREATE TABLE registrations(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50),
email VARCHAR(50),
email_id INT
);
CREATE TABLE email(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
email VARCHAR(50),
person_id INT
);
CREATE TABLE person(
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50)
);
ALTER TABLE registrations
ADD FOREIGN KEY (email_id) REFERENCES email (id);
ALTER TABLE email
ADD FOREIGN KEY (person_id) REFERENCES person (id);
工作流程是: -
处理注册信息,
- 如果电子邮件是新的,添加它,否则分配它。
- 如果这个人是新人添加它,否则分配它。
示例代码:
function newRegistration($input){
$registraton = new Registration();
$registraton->setUsername($input['username']);
$registraton->save();
$email = null;
if(Email::exists($input['email'])){
$email = Email::find($input['email']);
}else{
$email = Email::create($input['email']);
}
$registraton->setEmailId($email->getId());
$registraton->save();//!!
$person = null
if(Person::exists($input['name'])){
$person = Person::find($input['name']);
}else{
$person = Person::create($input['name']);
}
if(!$email->getPersonId()){
$email->setPersonId($person->getId());
$email->save();//!!
}
}
代码只是示例,在实际实现中有更多的触发器和依赖,以及处理事件的顺序:
Registration->Email->Person
这显然不是更新刚刚创建的元素的便捷方式......我正在寻找设计模式或数据库架构如何优化这个场景。
编辑:
一个电子邮件可能有多个注册,一个人可能有多个电子邮件。