EER 다이어그램 1 대 1 에러 (1 대 N으로 인식)
Forward Engineer: 자신의 설계한 Model을 실제 DB에 반영하는 것
Reverse Engineer: DB의 내용을 가지고 Model을 만드는 것
에러 발생 과정
1. 아래와 같이 Reverse Engineering을 하여서 두 엔티티 간에 1대1 식별관계를 맺었다
2. 그리고 FowardEngineering을 통해 실제 DB에 반영을 완료했다.
3. 여기서 버그가 생겼는데 , 해당 DB를 다시 reverse engineering하면 1대1 관계가 1대N으로 전환되어 있었다.
시행 착오
synchornize model도 해보고, fk에 uq설정(check) 도 해봤지만 도루묵
3일전에 올라온 따끈한 질문글! 해당 질문자도 나와 같은 오류를 겪고있었다.
답변 내용은 이렇다.
그 관계(질문자의 쿼리문)는 1대1이 아니다. 따라서 툴은 이러한 것들을 1대 0/ n 으로 올바르게 보여주고 있다. 예를 들어, 데이터 모델은 내가 하나의 'user_id'에 둘 이상의 'agent_id'를 할당하는 것을 막지 못할 것이다.
1대1 관계를 구현하는 올바른 방법은 하위 유형의 기본 키가 상위 유형의 기본 키인지 확인( the primary key of the subtype is the primary key of the parent )하는 것이다.
CREATE TABLE test.agent
(
agent_id INT NOT NULL,
CONSTRAINT PK_agent PRIMARY KEY (agent_id),
CONSTRAINT FK_agent_is_user FOREIGN KEY (agent_id) REFERENCES test.user (user_id)
)
;
//질문자 쿼리문
PRIMARY KEY (`agent_id`),
INDEX `fk_agent_user1_idx` (`user_id` ASC),
CONSTRAINT `fk_agent_user1` FOREIGN KEY (`user_id`) REFERENCES `test`.`user` (`user_id`)
> agent_id를 pk,fk인 복합키 식별매핑을 하라는건지 일단 따라해봤지만 안먹혔다.
결론
StackOverflow에서 해답을 찾은 것 같다
1. after reverse Engineer MySQL Workbench change 1:1 relationship to 1:n
(check)
해당 질문의 답변은 아래와 같다.
> Mysql Workbench의 reverse 와 forward engineering의 부족이다.
관계의 카디널리티는 생성된 외래키에 사용되는 인덱스 유형을 결정해야한다. 1대1이면 1에 대해 고유 인덱스가 필요하다. 고유하지 않으면 인덱스는 1...n의 카디널리티를 허용한다.
그러나 해당 툴은 FK를 사용하여 0...1의 카디널리티를 모델링을 할 수없다. 외래키에는 적어도 1개 의 값을 갖고 있어야 하기 때문이다.
카디널리티란? 간단하게 특정 컬럼의 중복 수치 (check)
2. MySQL - One To One Relation?
해당 질문의 답변은 아래와 같다.
> 1대 N 에서 N은 (1 .. N) 뿐만 아니라 (0... N)도 포함하는데 해당 버전은 (0 ...1)도 N으로 인식한 것 같다
그래서 결론은 StackOverflow에 나와 같은 질문들이 드물게 있었고 답변은 모두 똑같았다.
1대N 관계에서 N은 1대 0...N 관계만을 나타내는 것이 아니라 1대 0...1 관계도 포함하기 때문에 Mysql Workbench에서 Model을 Reverse Engineering으로 EER Diagram으로 나타날 때 발생하는 표현의 한계인 것 같다.