#8 Foreign Keys

#8.1 Data Normalization

데이터베이스 정규화

  • Normal form에 따라 Database를 설계하고 디자인하는 방법에 대한 모범 사례

  • Database에서 중복되는 data를 제거할 수 있게 해줌, data가 한 곳에만 저장되도록 함

  • 중복되지 않은 data는 수정 / 추가 / 제거 등이 빠르다

#8.2 Entities

CREATE TABLE dogs (
    dog_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50) NOT NULL,
    breed_name VARCHAR(50) NOT NULL,
    breed_size_category ENUM('small', 'medium', 'big') DEFAULT 'small',
    breed_typical_lifespan TINYINT,
    date_of_birth DATE,
    weight DECIMAL(5,2),
    owner_name VARCHAR(50) NOT NULL,
    owner_email VARCHAR(100) UNIQUE,
    owner_phone VARCHAR(20),
    owner_address TINYTEXT
);
-- DOG / BREED / OWNER 3개의 entity로 구분 가능

CREATE TABLE dogs (
  dog_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  date_of_birth DATE,
  weight DECIMAL(5,2),
  owner_id BIGINT UNSIGNED,
  breed_id BIGINT UNSIGNED
);

CREATE TABLE owners (
  owner_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  owner_name VARCHAR(50) NOT NULL,
  owner_email VARCHAR(100) UNIQUE,
  owner_phone VARCHAR(20),
  owner_address TINYTEXT
);

CREATE TABLE breeds (
  breed_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  breed_name VARCHAR(50) NOT NULL,
  breed_size_category ENUM('small', 'medium', 'big') DEFAULT 'small',
  breed_typical_lifespan TINYINT
);

#8.3 Foreign Keys

Foreign Key - 다른 table에 있는 column을 참조하는 column

Foreign Key Constraints - Foreign Key에 제약을 줌으로써 일관된 데이터를 저장할 수 있음

CREATE TABLE dogs (
  dog_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  date_of_birth DATE,
  weight DECIMAL(5,2),
  owner_id BIGINT UNSIGNED,
  breed_id BIGINT UNSIGNED,
  FOREIGN KEY (owner_id) REFERENCES owners (owner_id),
  CONSTRAINT breed_fk FOREIGN KEY (breed_id) REFERENCES breeds (breed_id)
);

CREATE TABLE owners (
  owner_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  email VARCHAR(100) UNIQUE,
  phone VARCHAR(20),
  address TINYTEXT
);

CREATE TABLE breeds (
  breed_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  size_category ENUM('small', 'medium', 'big') DEFAULT 'small',
  typical_lifespan TINYINT
);

INSERT
  INTO breeds (name, size_category, typical_lifespan)
  VALUES ('Golden Retriever', 'big', 12);

INSERT
  INTO owners (name, email, phone, address)
  VALUES ('Adam Smith', 'adam@smith.com', '11223344455', '9010 St. Scotland');

INSERT
  INTO dogs (name, date_of_birth, weight, breed_id, owner_id)
  VALUES ('Champ', '2022-03-15', 10.5, 1, 1);

#8.4 ON DELETE

ON DELETE

CASCADE - 데이터가 삭제되면 연관된 데이터도 함께삭제

SET NULL - NOT NULL이 아닐 때 사용 가능, NULL

SET DEFAULT - 기본값 설정

CREATE TABLE dogs (
  dog_id BIGINT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50) NOT NULL,
  date_of_birth DATE,
  weight DECIMAL(5,2),
  owner_id BIGINT UNSIGNED,
  breed_id BIGINT UNSIGNED,
  FOREIGN KEY (owner_id) REFERENCES owners (owner_id) ON DELETE CASCADE,
  constraint breed_fk FOREIGN KEY (breed_id) REFERENCES breeds (breed_id) ON DELETE SET DEFAULT
);

ALTER TABLE dogs
	DROP FOREIGN KEY owner_fk;
	ADD CONSTRAINT owner_fk FOREIGN KEY (owner_id) REFERENCES owners (owner_id) ON DELETE SET NULL;

#8.5 One-To-Many and One-To-One

#8.6 Many-To-Many

Last updated

Was this helpful?