我有一个收集和处理用户信息的应用程序。
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);
fiddle
工作流程为:
-处理注册信息,
-如果电子邮件是新邮件,则添加它,否则分配它。
-如果此人是新来的,请将其添加,否则进行分配。
示例代码:
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();//!!
}
}
该代码仅是示例,在实际的实现中,有更多的触发器和相关性以及处理事件的顺序:
注册->电子邮件->人员
显然,这不是更新刚刚创建的元素的简便方法。我正在寻找设计或数据库体系结构如何优化此方案。
编辑:
一个电子邮件可能有多个注册,
可能会有多封电子邮件发送给一个人。
最佳答案
我很难理解为什么尝试使用系统中存在的名称进行注册,但使用不同的电子邮件会导致将不同的电子邮件与现有用户相关联。通常,在像这样的系统中,电子邮件被视为唯一的ID,因此新用户被迫选择不存在的用户名。同样,如果这是典型的交互式注册,则很有可能无需将注册尝试存储在单独的表中。如果您确实希望用户与多个邮件相关联,则更好的方法可能是将初始注册电子邮件视为主要电子邮件,并允许已登录的用户将辅助电子邮件添加到其帐户中。
关于php - 逆转多层次,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17694741/