새로운 요구 사항이 이전 코드베이스에 나타났습니다.이 코드는 기본적으로 이전에 관련이 없었던 두 사용자 클래스 사이의 기본적으로 (내부) 통신을 가능하게합니다 (완전히 다른 스키마를 가진 다른 테이블에 저장 됨) 덜 디자인되었으므로 부모 클래스가 없습니다). 우리는이 기능을 고려하지 않은이 오래된 설정에 봉착하기 때문에 사용중인 데이터 세트를 고려할 때 PK 충돌이 없다고 보장 할 수는 없습니다. 실제로 보장됩니다.
따라서 해결책은 분명해 보입니다. 화재로 죽이고 전체 엉망인 매핑 테이블을 다시 작성하십시오 . 나는지도를 구현하는 가능한 방법에 대해 두 가지 방향을 얻었지만 DBA는 아니므로 놓친 장단점이 있는지 확실하지 않습니다.
추상화를 명확하게하기 위해 교수, 관리, 학생의 세 가지 개별 사용자 데이터 그룹을 고려하십시오 (아니오, 이것은 숙제 과제가 아닙니다. 약속합니다!).
매핑 1
(professor_id, admin_id 및 student_id는 해당 테이블의 외래 키입니다)
| mailing_id (KEY) | professor_id | admin_id | student_id |
-------------------------------------------------------
| 1001 | NULL | 87 | NULL |
| 1002 | 123 | NULL | NULL |
| 1003 | NULL | NULL | 123 |
이 접근법에 대한 +/-는 단점에 꽤 무거워 보입니다.
- 행당 2 개의 "폐기물"필드
- 2NF 위반
- 예외 삽입 / 업데이트 취약점 (예 : 0-1 필드 만 NULL로 설정된 행)
그러나 전문가들은 자신의 장점이 없습니다.
- 단일 조회로 매핑을 수행 할 수 있습니다
- mailing_id에서 특정 사용자의 "소스"데이터를 쉽게 결정
진실은 내 직감에서 나는이 아이디어를 전혀 좋아하지 않는다는 것입니다.
매핑 2
(MSG_ *가 상수, 열거 형 또는 다른 적절한 식별자로 정의되어 있다고 가정)
| mailing_id (KEY) | user_type (UNIQUE1) | internal_id (UNIQUE2)|
------------------------------------------------------------------
| 1001 | MSG_ADMIN | 87 |
| 1002 | MSG_PROF | 123 |
| 1003 | MSG_STUDENT | 123 |
이 설정과 {user_type, internal_id}의 고유 한 복합 인덱스는 훨씬 깔끔 해지고 3NF는 유지되며 응용 프로그램 코드는 I / U 이상을 확인할 필요가 없습니다.
단점은 DB 외부에서 처리해야하는 사용자 소스 테이블을 결정하는 데있어 약간의 투명성 손실이 있으며, 기본적으로 user_type 값을 테이블에 응용 프로그램 수준으로 매핑합니다. 지금은 단점이 적기 때문에이 두 번째 매핑에 기울고 있습니다.
그러나 나는 내 자신의 한계를 고통스럽게 알고 있으며 아마도 두 가지 방향에서 장점이나 장애물을 놓쳤을 것이라고 확신하므로 내 것보다 더 현명한 마음으로 향합니다.