TIL SQL문으로 테이블 관계형성하기

ESH'S VELOG·2023년 7월 25일
1

목표:

  • 손님들의 주문을 받아 가격이 있는 영수증 발행
  • 재고 관리(order_item table)
    : 각 메뉴들은 여러 개의 발주를 넣을 수 있으므로 item과 order_item은 1:N관계
  • 주문 관리(order_customer)
    : item과 order_customer는 N:M 관계
  • 옵션은 여러 메뉴들에 해당하는 사항이기 때문에 option과 item테이블은 1:N 관계

우선 메뉴가 있는 테이블이 존재해야 관계설정이 가능하기 때문에 item테이블을 먼저 생성해주었다. 이번에는 sequelize말고 직접 로우쿼리로 작성해보았다.

CREATE TABLE IF NOT EXISTS item (
    id bigint(5) NOT NULL AUTO_INCREMENT,
    name bigint(5) NOT NULL,
    option_id bigint(5) NOT NULL,
    price bigint(5) NOT NULL,
    type varchar(255) NOT NULL,
    amount bigint(5) NOT NULL,
    PRIMARY KEY(id)
)

숫자 타입 의미

크기에 따라 숫자 타입이 나뉜다
tinyint - smallint - int - bigint
단어 그대로 bigint는 가장 큰 용량의 숫자 데이터 타입이다.
또한 소괄호안의 숫자는 자리수를 의미한다. Zerofill이라는 옵션을 추가로 사용할 때만 의미가 있고 그것이 아니면 큰 의미가 없다.
ex) int(5), Zerofill옵션을 사용하면 숫자 2를 넣었을 때 00002가 나오게 된다.

나는 생각없이 테이블을 작성하였지만 데이터베이스의 용량을 설정하는 것과 유지비가 연관이 되기때문에 되도록이면 효율적인 용량을 설정할 수 있도록 하기위해 다시 작성해보았다.

DROP TABLE item

CREATE TABLE IF NOT EXISTS item (
    id SMALLINT NOT NULL AUTO_INCREMENT,
    name VARCHAR(255) NOT NULL,
    option_id SMALLINT NOT NULL,
    price SMALLINT NOT NULL,
    type ENUM('COFFEE','TEA','JUICE','SMOOTHIE') NOT NULL,
    amount SMALLINT NOT NULL,
    PRIMARY KEY(id)
);

우선 처음 데이터테이블과 차이점은
1) bigint -> smallint로 바꿔주었다 int가 차지하는 크기는 4바이트고 smallint(-32,768~32,767)를 써도 충분하다고 판단하였다.
2) 숫자타입 옆의 숫자자리를 의미하는 소괄호안의 숫자를 빼주었다.
3) 문자열타입의 varchar를 설정하고 ENUM을 설정해주었다.

profile
Backend Developer - Typescript, Javascript 를 공부합니다.

0개의 댓글