2013-07-17 3 views
0

나는 사용자 정보를 수집하고 처리하는 앱을 가지고있다. 많은 계층 구조를 되 돌린다

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

워크 플로는

:
등록 정보 - 프로세스,
이메일 -if는 할당 다른, 추가의 새로운 기능입니다.
- 사람이 새로 추가 된 경우 추가하거나 추가하십시오.

코드 :

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

}

, 실제 구현에 더 트리거와 의존성 그냥 예가되는 코드 및 처리 사건의 순서 :
등록 -> 이메일 -> 사람

이것은 분명히 그냥 crea를 업데이 트하는 편리한 방법이 아닙니다 테드 요소 ... 나는이 시나리오를 최적화하는 방법을 disign-patern 또는 DB 아키텍처를 찾고 있습니다.

편집 :
한 이메일과 곱셈 등록이있을 수는 한 사람에 여러 개의 이메일이있을 수 있습니다.

+0

'sidenote :''parson_id'라는 라벨이 붙은'person_id'가 누락되었습니다 – DevZer0

+1

그 테이블들 간의 관계를 제공 할 수 있습니까? 나에게 하나의 테이블에서 모든 것을 병합하는 것이 좋을 것 같다. 단, 일대 다 관계가 없다면 말이다. PHP를 사용하고 있기 때문에 "방금 작성한 요소를 업데이트"할 필요가 없습니다. 모든 필수 정보를 데이터베이스에 채울 때 한 번 작성하십시오. – Eggplant

+0

나는 레코드가 존재하는지 검사하는 것이 아니라 ON DUPLICATE KEY UPDATE 구문을 사용하여 새로운 레코드를 삽입하는 것이 좋습니다. 이것을 사용하여 새 레코드의 id 나 기존 레코드의 id를 반환 할 수 있습니다. – Kickstart

답변

0

시스템에 있지만 다른 전자 메일 이름으로 등록 시도가 다른 전자 메일을 기존 사용자와 연결해야하는 이유를 이해하는 데 어려움이 있습니다. 일반적으로 시스템에서 전자 메일은 고유 한 ID로 취급되며 새 사용자는 존재하지 않는 사용자 이름을 선택해야합니다. 또한 이것이 전형적인 대화 형 등록 인 경우 등록 시도를 별도의 테이블에 저장할 필요가 거의 없습니다. 사용자가 둘 이상의 메일과 연결되기를 원한다면 초기 등록 이메일을 기본 이메일로 취급하고 로그인 한 사용자가 자신의 계정에 보조 이메일을 추가 할 수 있도록하는 것이 좋습니다.

+0

좋은 지적. 등록은 로그인에 사용되지 않고 단지이 응용 프로그램 (다른 출처에서 온 것입니다)에서 처리되는 데이터입니다 –

+0

사용자 디자인 처리의 목적과 선호되는 결과에 대해 조금 알지 못하면 시스템 설계를 돕는 것이 어렵습니다. 저에게 명백하고 사물을 단순하게 표현할 수있는 한 가지는 등록 테이블의 email_id입니다. 나는 이것이 중복되고 잠재적으로 시스템의 진실성에 대한 규칙을 위반한다고 생각합니다.다른 것은 등록을 입력으로 간주하고 데이터를 처리 결과로 직접 전자 메일로 저장하는 것입니다. 이 방식으로 모든 후속 처리와 시스템의 현재 상태는 두 테이블로만 표현됩니다. hth –

관련 문제