candidate key는 schema가 row를 유일하게 식별하도록 정한 최소 column 집합입니다. 이 lesson에서는 customers.id와 orders.id를 primary key로 선택했고, orders.customer_id는 customers.id를 참조합니다.
Engine-neutral Foundation 01
Tables, rows, and keys
schema는 무엇을 허용하고, 현재 rows는 어떤 key 조건을 이미 만들고 있나요?
schema와 현재 rows를 분리하고, primary key와 foreign key가 proposed order를 어떻게 판정하는지 직접 확인합니다.
schema는 무엇을 허용하고, 현재 rows는 어떤 key 조건을 이미 만들고 있나요?
customers는 customer rows를, orders는 order rows를 담습니다. 둘은 orders.customer_id → customers.id로 연결됩니다.
Schema와 현재 rows 구분하기
schema는 customers와 orders가 허용하는 columns와 constraints를 정의합니다. current rows는 그 구조 아래 지금 들어 있는 값입니다.
Schema definition
CREATE TABLE customers (
id INTEGER NOT NULL,
name VARCHAR(80) NOT NULL,
country_code CHAR(2) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE orders (
id INTEGER NOT NULL,
customer_id INTEGER NOT NULL,
status VARCHAR(20) NOT NULL,
ordered_at TIMESTAMP NOT NULL,
total_cents INTEGER NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (customer_id) REFERENCES customers(id)
);| id | name | country_code |
|---|---|---|
101 | Mina | KR |
102 | Noah | US |
103 | Lina | DE |
| id | customer_id | status | ordered_at | total_cents |
|---|---|---|---|---|
5001 | 101 | PAID | 2026-07-28 09:10:00 | 3200 |
5002 | 102 | PENDING | 2026-07-28 10:20:00 | 7500 |
5003 | 101 | SHIPPED | 2026-07-29 13:40:00 | 12800 |
Proposed order 하나를 고르세요
세 row는 한두 값만 달라집니다. 먼저 schema와 current rows를 근거로 판정해 보세요.
결과를 예측하세요
세 row는 한두 값만 달라집니다. 먼저 schema와 current rows를 근거로 판정해 보세요.
Constraint checks와 최종 rows
세 row는 한두 값만 달라집니다. 먼저 schema와 current rows를 근거로 판정해 보세요.
| id | customer_id | status | ordered_at | total_cents |
|---|---|---|---|---|
5001 | 101 | PAID | 2026-07-28 09:10:00 | 3200 |
5002 | 102 | PENDING | 2026-07-28 10:20:00 | 7500 |
5003 | 101 | SHIPPED | 2026-07-29 13:40:00 | 12800 |
용어 확인
schema- table이 허용하는 column, data type, key와 constraint를 정의한 구조입니다.
current rows- 그 schema 아래 현재 table에 저장되어 있는 값의 집합입니다.
relation / table- 같은 column 구조를 공유하는 rows를 다루는 관계 모델의 relation과 SQL의 table 표현입니다.
row- 한 entity나 사실을 나타내며 각 column에 하나의 값을 가진 항목입니다.
column- 모든 row에서 같은 의미와 domain을 갖는 속성입니다.
candidate key- schema가 row를 유일하게 식별하도록 정한 최소 column 집합입니다. 예제 값이 우연히 다르다는 사실만으로 정하지 않습니다.
primary key- candidate key 중 row의 대표 identity로 선택한 key입니다.
foreign key- 한 table의 column이 다른 table의 candidate 또는 primary key를 참조하도록 선언한 constraint입니다.
referential integrity- foreign key 값이 허용된 parent row를 가리키도록 관계를 유지하는 규칙입니다.
Source boundary
화면의 결과는 고정 fixture rows에 이 lesson의 constraints를 적용해 계산한 값이며, 관계 모델 개념을 설명하기 위한 것입니다. 설명을 일정하게 유지하려고 primary key를 먼저, foreign key를 다음으로 확인합니다. 특정 DB engine의 오류 순서나 물리 저장 구조를 뜻하지 않습니다.
- Concept · relationalRelational schema and constraints
schema, table/row/column, candidate·primary·foreign key와 referential integrity 설명
- Derived · fixtureEngine Atlas lesson fixture
체크인된 customers/orders rows와 두 constraint를 순서대로 적용한 정확한 판정
JavaScript 없이 읽는 전체 lesson
schema는 customers와 orders가 허용하는 columns와 constraints를 정의합니다. current rows는 그 구조 아래 지금 들어 있는 값입니다.
candidate key는 schema가 row를 유일하게 식별하도록 정한 최소 column 집합입니다. 이 lesson에서는 customers.id와 orders.id를 primary key로 선택했고, orders.customer_id는 customers.id를 참조합니다.
CREATE TABLE customers (
id INTEGER NOT NULL,
name VARCHAR(80) NOT NULL,
country_code CHAR(2) NOT NULL,
PRIMARY KEY (id)
);
CREATE TABLE orders (
id INTEGER NOT NULL,
customer_id INTEGER NOT NULL,
status VARCHAR(20) NOT NULL,
ordered_at TIMESTAMP NOT NULL,
total_cents INTEGER NOT NULL,
PRIMARY KEY (id),
FOREIGN KEY (customer_id) REFERENCES customers(id)
); customers · parent rows
| id | name | country_code |
|---|---|---|
101 | Mina | KR |
102 | Noah | US |
103 | Lina | DE |
orders · current child rows
| id | customer_id | status | ordered_at | total_cents |
|---|---|---|---|---|
5001 | 101 | PAID | 2026-07-28 09:10:00 | 3200 |
5002 | 102 | PENDING | 2026-07-28 10:20:00 | 7500 |
5003 | 101 | SHIPPED | 2026-07-29 13:40:00 | 12800 |
세 proposed row의 결과
- 기존 order id를 다시 사용
orders.id 값이 이미 있으므로 PRIMARY KEY (id) constraint인 orders.primary-key가 insert를 거부합니다.
- 없는 customer를 참조
orders.customer_id와 일치하는 customers.id row가 없어 FOREIGN KEY (customer_id) constraint인 orders.customer-foreign-key가 insert를 거부합니다.
- 새 order와 기존 customer를 연결
orders.id가 PRIMARY KEY (id)를 통과하고 orders.customer_id가 기존 customers.id를 가리켜 FOREIGN KEY (customer_id)도 통과하므로 proposed row가 orders에 추가됩니다.
화면의 결과는 고정 fixture rows에 이 lesson의 constraints를 적용해 계산한 값이며, 관계 모델 개념을 설명하기 위한 것입니다. 설명을 일정하게 유지하려고 primary key를 먼저, foreign key를 다음으로 확인합니다. 특정 DB engine의 오류 순서나 물리 저장 구조를 뜻하지 않습니다.