| English | 의미 |
|---|---|
| relational database/rɪˈleɪʃənl ˈdeɪtəbeɪs/ | 관계형 데이터베이스 |
| tables/ˈteɪblz/ | 테이블 |
| entities/ˈentɪtiz/ | 엔티티 |
| primary key/ˈpraɪməri kiː/ | 주키 |
| foreign key/ˈfɒrən kiː/ | 외부 키 |
| normalisation/ˌnɔːməlaɪˈzeɪʃn/ | 정규화 |
이름이 변경된 과정이 두 가지 제목을 가짐
- 학교가 등록 행의 모든 줄에 과정 제목을 복사합니다. 일부 복제본을改名하면 같은 과정에 대해 두 개의 상충되는 제목이 생성됩니다.
- 관계형 데이터베이스는 테이블에 행을 저장합니다. 먼저 학생과 과정과 같은 엔티티와 그들 사이의 관계를 식별하십시오.
고유 식별자와 변경 가능한 레이블 분리
- 주키는 행을 고유하게 식별하며 NULL일 수 없습니다. 안정적인 학생 ID는 이름 변경 시에도 학생의 정체성 자체를 변경하지 않게 합니다.
- 고유의 독특성과 안정성이 보장될 때 자연 키가 작동할 수 있습니다. 이 경우 이름은 부적절한 키입니다. 왜냐하면 여러 학생이 같은 이름을 공유할 수 있으며, 이메일 또한 변경될 수 있기 때문입니다.
학생은 같은 이름을 사용할 수 있고 이메일 주소를 변경할 수 있습니다. 이 설계에 가장 적절한 키는?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
반복되거나 변경되는 라벨이 아닌 안정적인 신원을 선택하십시오.
다대다 관계 표현
- 한 학생은 여러 과정을 들을 수 있고, 한 과정에는 여러 학생이 있을 수 있습니다. 각 학생-과정 쌍에 대한 행을 가진 등록 테이블을 사용하십시오.
- 외부 키는 각 등록을 유효한 학생 또는 과정 키와 연결합니다. 복합 주키
(student_id, course_id)는 동일한 쌍이 두 번 나타나는 것을 방지합니다.
학생이 여러 과목을 수강하고 과목에 많은 학생이 있는 상황을 나타내는 설계는?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
각 등록 기록은 하나의 학생-과목 쌍을 기록합니다.
등록을 기존 과목 키에 연결하는 키는 어떤 종류입니까?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
외부 키는 Enforcement가 활성화될 때 이 참조를 표현하고 제한합니다.
동일한 학생-과목 쌍이 두 번 나타나는 것을 방지하는 제약 조건은 무엇입니까?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
복합 기본 키가 이 쌍을 식별합니다.
과정 정보를 과정과 함께 저장
- 정규화는 종속성을 기반으로 테이블을 구성하여 일관되지 않은 반복을 줄입니다. 이 설계에서 과정 ID는 제목을 결정하므로, 제목은 courses 테이블에 저장해야 합니다.
- 반복되는 외부 키 값은 예상되는 현상입니다: 여러 등록이 하나의 과정을 가리킬 수 있습니다. '어떤 값도 절대 반복하지 마라'는 유용한 데이터베이스 설계 규칙이 아닙니다.
여러 등록 행에 동일한 과목 ID를 반복하는 것은 항상 정규화 오류입니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
반복된 참조는 예상됩니다. 과목명을 각 관계 행에 복사하면 여기서 업데이트 문제가 발생합니다.
제약 조건 활성화 및 테스트
- SQLite에서는 작업 시작 전에 각 연결에서 외래 키 강제 기능을
PRAGMA foreign_keys = ON로 활성화하십시오. 관계만 선언하는 것만으로는 충분하지 않습니다. - 유효한 등록, 중복 쌍 및 결석한 과정을 가리키는 등록을 테스트합니다. 제약 조건은 마지막 두 경우를 거절해야 하며, 이는 어떤 호출 주체가 권한을 가지는지 결정하지 않습니다.
PRAGMA foreign_keys = ON;
CREATE TABLE students (id INTEGER PRIMARY KEY, name TEXT NOT NULL);
CREATE TABLE courses (id INTEGER PRIMARY KEY, title TEXT NOT NULL);
CREATE TABLE enrolments (
student_id INTEGER REFERENCES students(id),
course_id INTEGER REFERENCES courses(id),
PRIMARY KEY (student_id, course_id),
CHECK (student_id IS NOT NULL AND course_id IS NOT NULL)
);
SQLite에서 외래 키를 선언하면 활성화하지 않아도 모든 연결에서 강제됩니다.
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
각 연결에서 PRAGMA foreign_keys = ON을 활성화하고 동작을 확인하십시오.
새로운 사례에 대한 설계 검증
- 도서관 대출의 경우 책 제목이 반드시 단일 물리적 복본을 의미하지는 않습니다. 키를 선택하기 전에 빌려주는 사람, 복본, 대출 이벤트를 식별하십시오.
- 반복 이벤트가 허용되는지 결정하십시오. 학생–과정 쌍은 여기서 하나의 등록을 식별할 수 있으나, 빌려주는 사람–복본 쌍은 서로 다른 날짜의 반복된 대출을 구분할 수 없습니다.
필요한 신원을 위한 키를 선택하십시오. 개체 사실과 관계 행을 분리한 후, 구체적인 사례로 일관성과 참조 제약 조건을 확인하십시오.
대출자가 동일한 물리적 단서를 여러 번 빌릴 수 있는 도서관을 위한 엔티티와 키를 제안하십시오.
난이도 3/5 · 200 코인 + 오늘 첫 완료 시 소액 보너스
대출자 ID, 단서 ID 및 필요한 이벤트 세부 사항이 포함된 별도의 대출 이벤트 신원을 사용하십시오.
차용자-사본 쌍만으로 반복된 대출의 키로는为什么不충분한가?
난이도 1/5 · 100 코인 + 오늘 첫 완료 시 소액 보너스
키가 기록하고자 하는 실제 사건들을 구별할 수 있어야 합니다.