ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.