-
231013_과제물Individual Learning/DB & SQL 2023. 10. 14. 01:19
1:1의 관계가 성립한다면 외래키는 어디에 넣든 상관없다.
1:N의 관계를 갖는다면 외래키는 항상 항상 N 쪽에 넣어야 한다.
N:M의 관계를 갖는다면 새로운 필드를 하나 만들어서, 각각의 외래키를 가지고 와 기본키를 생성한다.
두 테이블간 관계의 구분 (1:N인지 N:M인지)은 데이터를 만들어 달라고 했던 사람의 요구사항에 따라서 결정됨.
위 내용을 바탕으로, 옆자리 학생이 의뢰한 DB 설계도를 구상해봤다.
뻘하지만 교실에서 작업한 파일을 기껏 가지고 왓는데 정작 내 컴퓨터에서는 열리지도 않아서 처음부터 다시 타이핑을 하느라 개고생을 했다. DB도 그렇고 Java도 그렇고 참 파일 하나를 옮겨 다른 컴퓨터에서 열기가 힘든 구조인 거 같다...
나만 그렇게 느끼는건지 모르겠다. 아니니까 굳이 깃허브 같은 프로그램을 쓰는거겠지... 라고 생각해봄.
create database Customer_list; use Customer_list; create table product_name ( seq INT NOT NULL AUTO_INCREMENT, top_number VARCHAR (30), bottom_number VARCHAR (30), Accessory_number VARCHAR (30), shoe_number VARCHAR (30), PRIMARY KEY(seq) ); CREATE TABLE product_reservation ( seq INT NOT NULL AUTO_INCREMENT, customer_name VARCHAR(20), Product_number INT, confirmation_of_deposit DATE, Address VARCHAR(50), tell VARCHAR(20), email VARCHAR(20), PRIMARY KEY (seq), FOREIGN KEY (Product_number) REFERENCES product_name (seq) -- FOREIGN KEY 를 이용해서 product_name 테이블의 seq 를 Product_number로 ); CREATE TABLE confirmation_of_deposit ( seq INT NOT NULL AUTO_INCREMENT, customer_name VARCHAR(20), tell VARCHAR(20), email VARCHAR(20), deposit_type VARCHAR(40), card_number VARCHAR(50), price INT, product_reservation_id INT, product_name_id INT, PRIMARY KEY(seq), FOREIGN KEY (product_reservation_id) REFERENCES product_reservation(seq), FOREIGN KEY (product_name_id) REFERENCES product_name(seq) ); CREATE TABLE Questions ( seq INT NOT NULL AUTO_INCREMENT, customer_name VARCHAR(20), tell VARCHAR(20), Inquiry_code VARCHAR(20), email VARCHAR(20), date_of_inquiry DATE, PRIMARY KEY(seq) ); CREATE TABLE Questions_ProductName ( question_id INT, product_name_id INT, PRIMARY KEY (question_id, product_name_id), FOREIGN KEY (question_id) REFERENCES Questions(seq), FOREIGN KEY (product_name_id) REFERENCES product_name(seq) ); CREATE TABLE Questions_ProductReservation ( question_id INT, product_reservation_id INT, PRIMARY KEY (question_id, product_reservation_id), FOREIGN KEY (question_id) REFERENCES Questions(seq), FOREIGN KEY (product_reservation_id) REFERENCES product_reservation(seq) ); CREATE TABLE Questions_ConfirmationOfDeposit ( question_id INT, confirmation_id INT, PRIMARY KEY (question_id, confirmation_id), FOREIGN KEY (question_id) REFERENCES Questions(seq), FOREIGN KEY (confirmation_id) REFERENCES confirmation_of_deposit(seq) ); CREATE TABLE Customer_Information ( seq INT NOT NULL AUTO_INCREMENT, customer_name VARCHAR (20), Address VARCHAR (50), tell VARCHAR (20), email VARCHAR (20), membership DATE, PRIMARY KEY(seq) ); -- Questions 테이블에 외래 키 추가 (1:N 관계) ALTER TABLE Questions ADD COLUMN customer_information_id INT, ADD FOREIGN KEY (customer_information_id) REFERENCES Customer_Information(seq); -- confirmation_of_deposit 테이블에 외래 키 추가 (1:N 관계) ALTER TABLE confirmation_of_deposit ADD COLUMN customer_information_id INT, ADD FOREIGN KEY (customer_information_id) REFERENCES Customer_Information(seq); -- product_reservation 테이블에 외래 키 추가 (1:N 관계) ALTER TABLE product_reservation ADD COLUMN customer_information_id INT, ADD FOREIGN KEY (customer_information_id) REFERENCES Customer_Information(seq); -- product_name 테이블에 외래 키 추가 (1:N 관계) ALTER TABLE product_name ADD COLUMN customer_information_id INT, ADD FOREIGN KEY (customer_information_id) REFERENCES Customer_Information(seq);
원래 각 테이블 Questions(문의), confirmation_of_deposit(입금), product_reservation(예약), product_name(상품명) 을 만들 때 1:N 관계가 될걸 생각하고 만들었어야 했는데... 아직 설계를 어떻게 해야하는지 잘 감이 안 잡혀서, 참조 할 영역이 비교적 적고 테이블이 다 만들어진 것들을 가지고 만들어보자 해서 아래와 같이 진행했다.
만든 순서는 상품명->예약->입금->문의고객->고객 순인데
1. 상품명:상품예약(1:1) 관계망이 상품예약의 참조가 상품명밖에 없어서 가장 먼저 만들었고
2. 상품예약: 입금(1:N) , 상품명:입금(1:N) 을 두번째로 만든 이유는 상품예약과 상품명이 모두 들어가기 때문, 위에서 1:1 관계망을 만들면서 테이블을 생성했기에 입금 테이블을 추가로 만들어 1:N 관계망을 만들었다.
3. 세번째로 고객 테이블을 먼저 만들어야 할지, 문의 테이블을 만들어야 할지 고민을 했다.
문의 테이블이 N:M 관계망이라서 문의 테이블을 마지막에 만드는게 맞는 것 같았는데, 문의 테이블을 먼저 만든 이유는 N:M 관계망을 맺을 상품명, 예약, 입금 테이블이 다 만들어져 있었기에 문의 테이블을 세번째로 만들었다.
4. 마지막으로 고객 테이블을 만들었는데, 고객 테이블과 1:N 관계망을 형성할 상품명, 문의, 입금, 예약 테이블이 이미 다 만들어져있어서 (이 부분이 미스였다는 생각이 든다.) 고객 테이블과 1:N 관계망을 형성할 FOREIGN KEY를 새로 추가해야 했다.
이걸 좀 더 보기 좋고 가독성 있게 정리할 수 있는 방법이 뭐가 있을까?
데이터는 아직 집어넣지 않았는데, 오늘 만든 설계를 바탕으로 각 테이블 별로 10개씩 집어넣어볼 생각이다.
코드는 백업 겸 업로드 해 놓음.
멘붕이즈굿~'Individual Learning > DB & SQL' 카테고리의 다른 글
231014_DB 과제물 (0) 2023.10.14 231014_과제물 보충 (0) 2023.10.14