Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 尊重多对一的等级制度_Php_Mysql_Design Patterns - Fatal编程技术网

Php 尊重多对一的等级制度

Php 尊重多对一的等级制度,php,mysql,design-patterns,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

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

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

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

这显然不是更新刚创建的元素的方便方法。。。我正在寻找设计模式或数据库架构如何优化这个场景

编辑
一封电子邮件可能会进行多次注册,
一个人可能有多封电子邮件。

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

旁注:
您错过了标记为
person\u id
parson\u id
您能提供这些电子邮件之间的关系吗桌子?在我看来,您最好将所有内容合并到一个表中,除非存在某种一对多关系。因为您使用的是PHP,所以实际上不需要“更新刚创建的元素”,只要在获得填充数据库的所有必需信息后创建它们一次即可。我建议,与其检查记录是否存在,不如使用ON DUPLICATE KEY update语法插入一条新的记录。使用此选项,您可以触发它返回新记录的id或现有记录的id(如果找到)。编辑
后,一封电子邮件可能会多次注册,一个人可能会收到多封电子邮件。
这听起来“与平常不同”,您是否也可以提供一些数据作为示例?你如何加强电子邮件地址和人之间的关系?我认为你不希望一个电子邮件地址被不止一个人使用,是吗?在您的模式中指定
外键
,这将帮助我们更好地理解该场景。这一点很好。注册不用于登录,它只是从这个应用程序处理的数据(它来自不同的来源)。如果不了解更多关于用户注册处理的目的和首选结果的信息,就很难帮助进行系统设计。有一件事对我来说似乎很明显,而且可能很简单,那就是注册表中的email_id。我认为这是多余的,并且可能违反了系统中单一真理点的规则。另一件事是我将注册视为输入,数据保存在个人和电子邮件作为处理结果。这样,系统的所有后续处理和当前状态仅由这两个表表示。嗯