反转多个到一个层次结构

时间:2013-07-17 08:25:02

标签: php mysql design-patterns

我有一个收集和处理用户信息的应用程序。

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();//!!
   }

}

代码只是示例,在实际实现中有更多触发器和依赖项,以及处理事件的顺序:
注册 - >电子邮件 - >人

这显然不是更新刚刚创建的元素的方便方式......我正在寻找e disign-patern或DB架构如何优化这种情况。

修改
一个电子邮件可能会多次注册, 一个人可能会有多封电子邮件。

1 个答案:

答案 0 :(得分:0)

我很难理解为什么使用系统中存在的名称但不同的电子邮件进行注册尝试会导致将不同的电子邮件与现有用户相关联。通常在类似的系统中,电子邮件被视为唯一ID,新用户被迫选择不存在的用户名。此外,如果这是典型的交互式注册,则很可能不需要在单独的表中存储注册尝试。如果您确实希望用户与多个邮件关联,则更好的方法可能是将初始注册电子邮件视为主要邮件,并允许登录用户向其帐户添加辅助电子邮件。