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。我认为这是多余的,并且可能违反了系统中单一真理点的规则。另一件事是我将注册视为输入,数据保存在个人和电子邮件作为处理结果。这样,系统的所有后续处理和当前状态仅由这两个表表示。嗯