我有一個收集和處理用戶信息的應用程序。混合多對一的層次結構
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();//!!
}
}
的代碼只是示例,在實際的實現中有更多的觸發器和依賴關係,以及處理該事件的順序:
登記 - >電子郵件 - >人
這顯然不是一種方便的方式來更新正義創造力特德元素...我正在尋找e-disign-patern或DB架構如何優化這種情況。
編輯:
可能有多重登記一個電子郵件, 可能有多個電子郵件到一個人。
'旁註:'你錯過了將'person_id'標記爲'parson_id' – DevZer0
你能否提供這些表之間的關係?對我來說,似乎你最好把所有東西都合併到一張表中,除非有一對一的關係。由於您使用的是PHP,因此您並不需要「更新剛剛創建的元素」,只需在獲取所有必填信息來填充數據庫時創建它們即可。 – Eggplant
我會建議,而不是檢查記錄存在,你只需使用ON DUPLICATE KEY UPDATE語法插入一個新的記錄。使用它可以觸發它返回新記錄的ID或現有記錄的ID(如果找到)。 – Kickstart