지난번 관계형 데이터베이스
의 개념을 공부하면서 알게된 Primary key
와 Foreign key
의 개념을 이용해 간단한 카페음료 table들을 만들어보았다!
만드는데 사용한 tool은 AQueryTool
이다. https://aquerytool.com/
이번 과제에서 참고한 것은 스타벅스
의 음료 category이다.
이 화면에서 당장 보이는 것은 무엇인가?
그러면 나이트로 바닐라 크림
을 선택하면 어떤것이 보이는가?
음료의 이름 / 설명 / 영양정보 / 알레르기 유발요인 / 이미지
대표적으로 이렇게 확인할 수 있다.
위의 정보들을 담기 위해 몇개의 table을 만들어야 하는가?
6개 ?!? 하지만... 하나의 table에 두종류의 column을 담는다면?
예를들어 음료의 이름과 음료의 설명을 같은 table의 다른 column으로 값을 입력한다고 가정하면 table의 수는 하나 줄게 된다.
그렇다면 같은 table에 담을수 있는 조건은 무엇일까?
나의 단어로 말하자면 딱 한가지마 해당되는 고유값만을 가진 요소일 경우 묶을수 있을 것이라 생각한다!
이후는 직접 만들면서 기록을 남겨야겠다.
당황스러운 첫 화면, 꽤 비어있다. 하지만 당황하지말고.. 마우스 우클릭! 테이블 추가하기!
Table name
Table의 이름 (이는 항상 "복수형" 으로 적는다. why? 어.. 그게맞지... 값이 여러개가 있을꺼니까?이건 영어문법문제인가? ㅋㅋ)
Table logical name
일종의 닉네임 이라고 생각! 팀과제땐 따로 적진 않았지만 지금 리뷰하면서는 적기로 하자.
Name
현재 테이블의 Column 이름 / 제일 위는 항상PK, AI에체크하고id
를 입력한다.
Type
입력 형식 (어떤 타입들이 있는지는 클릭해서 선택하면 됨! 참고로 boolean은 없다... )
Logical Name
column의 닉네임!
정확한 이유는 말로 표현 못하지만;; Table name과 (column)Name은 영어로 써준다! 때문에 현재 리뷰에서 그 영어가 정확히 뜻하는 것이 무엇인지 헷갈릴 수 있기 때문에 일명 닉네임을 사용하기로 한다.
가장 먼저 만들 table은 가장 먼저 생각나고, 메인이라 생각하는 beverage 항목이다.
!! table 이름은 복수형 !!
이때 생각으론,,, 음료의 이름이 있고, 그 음료를 설명하는 사진은 한장씩 있고, 설명도 한개씩 있으므로 모두가 하나씩 있는 값이므로 한 table안에 같이 입력해 주었다. (나중엔 이 생각 바뀜 ㅋㅅㅋ;;)
하나의 category (음료 종류에 관한 category를 의미한다) 에는 여러 종류의 음료가 담긴다. 때문에 이는 1:N 의 관계로 PK와 FK의 개념을 사용해야 한다!!!!
그리고 나서 beverages 에도 categories의 id로 FK로 받을 수 있도록 Name을 추가해 준다.
!! FK로 받는 항목은 table이름(단수형)_id
의 형식으로 입력한다 !!
그 뒤 화살표로 끌어서 이어주기 (FK로 쓸 항목의 FK에 커서를 올려서 drag 하여 참조되는 table의 id 항목으로 drop 해주면 된당!) 카테고리는 문자열! VACHAR 사용하기.
홈페이지 기준으로 음료 1개당 size는 1개롤 표시된다 (어떤건 tall만, 어떤건 venti 만 써있음) 그러나,, 매장에 가서 메뉴판을 보면 아이스아메리카노도 사이즈가 3개다 때문에 한가지 음료에 여러개의 size
이므로 이 역시 1:N의 관계이다.
사이즈는 문자열! VACHAR를 사용한다.
이건 왜 단수형이냐고? profile이라고 이름을 썼으니까......... (영어잘하는 분이 알려줘따)
영양성분은 그 항목이 여러개다! 홈페이지 기준으로
이 항목들을 확인할 수 있었다. 수치는 숫자! INT를 사용한다.
음료의 신상여부를 파악해야 한다.
신상여부는 "신상이다" "신상이아니다"로 표현하는 걸 의도하였다.
beverage table에 직접 Name으로 입력하여 일일이 다 입력해도 되긴..하지만 그것보다는 new_status라는 talbe을 만들고, 그 table에 1 - "신상입니다. / 2 - "신상이아닙니다" 에 대한 값을 작성한다고 가정하였을 때, 이러한 new_status table의 pk를 beverages에서 FK로 사용하는 것이 메모리가 덜 소모된다 생각한다!!!
+) 사실 True / False로 표현하는 boolean 타입도 생각해 봤는데 type 선택란에 boolean이 없다 ㅠㅠㅠ!!
알러지.. 생각을 많이 했던 항목이다.
음료 중 제주 쑥떡 크림 프라푸치노
가 있다! 이 음료의 알레르기 유발요인에는 대두/우유/밀
이 있다. 3개!
그럼 다른 메뉴는 ?? 음료 모카 프라푸치노
에는 우유
가 있다.
즉, 하나의 음료는 여러개의 알레르기 유발 요인을 가지고 있고, 하나의 알레르기 유발요인 요소도 여러 음료에게 알레르기를 유발시킨다!
N : N
/ Many to Many
의 관계로 표현할 수 있다. 때문에 중간 table
이 필요!!
값이 없어도 되는 column에 한해서 Null 을 체크하였고, 값이 없으면 말이 안되는 것은 체크를 해제해 주었다.
음료의 설명에 대해서 image나 description이 없을수도 있지! 하면서 체크..체크..
FK로 참조하는것, 참조되는것들은 절대!! 값이 없어선 안되고, 그 외에도 값이 존재하지 않는게 인정되면 안되는 column들을 골라체크를 해제해 주었다.
1차 프로젝트하면서 FK로 받아오는 값인데 null=True
로 설정해준 값이 있다.
delivery_fee_id
인데 이값이 null 이면 배송요금이 없음을 뜻하게 했다.
만약 null=True를 하고싶지 않다면 delivery_fee 라는 table에 배송료가 0원임을 뜻하는 intance를 만들고 그 값의 id를 FK로 물리게 하면 된다.!
뭐가 더 좋은지는 사실 아직 모르겠다. 기능의 차이는 없는데....
방금 리뷰를 작성하면서 만든 화면 (앗, null 체크 안함)
실제 과제를 제출한 화면
FK로 받아오는 것들에 _id를 안쓴것도 있다 ㅎ
참고로.. 과제를 작성하면서 table을 더 쪼갤수도, 덜 쪼갤수도 있는 상황이 왔을때 어떻게 할지 고민을 했다. 일단 깔끔해 보이기! 가 목표였으므로 최소한의 갯수로 모델링을 완성하고자 하였다.
우리팀 리뷰 / 다른팀 리뷰를 구분하고 싶었지만.. 다른팀이 피드백 받은 부분들 모두 우리팀에서 미쳐 신경쓰지 못해서 같이 틀렸거나 혹은, 신경쓰지 않았지만 맞게 표현했거나 이다. 때문에 합쳐서 모든 피드백 사항을 기록한다!
Type중에 TINYINT 라는 것이 있다. 이것은 작은 범위의 숫자를 의미하는데 AQueryTool에서는 boolean의 값이 없기 때문에 이것으로 체크한다!
booelean으로 표기하고자 하는 field의 이름은 보통 is_new
처럼 앞에 is_
를 붙여준다! Boolean값에서 1=True
를 0=False
를 의미한다.
DECIMAL
이라는 것도 있다. 이는 소수점 갯수를 제한하여 표현 가능하다.!100.15
이런식으로 표현 가능홈페이지에서 음료를 몇개 더 살펴보면 하나의 음료에 사진이 여러개
인 경우도 있다. 때문에 음료와 사진은 1:N의 관계가 된다.
beverages table에 있던 image를 삭제하고, 따로 images라는 table을 작성해 1 : N 으로 연결
해준다.
사진을 입력한다고 해서 말 그대로 사진
을 넣는것은 아니다. 사진을 보여줄 수 있는 경로의 url
을 넣는 것이다. 때문에 type은 VARCAHR
로 지정한다.
+) 참고로 이미지 형태를 그대로 넣으려면 Type중 BLOB type을 사용하면 된다.
음료라는 메뉴
안에 카테고리
가 있는 것이다.
때문에 정확히 표현하려면
이렇게 두개 여야 한다.
여기서 메뉴-카테고리는 1 : N
/ 카테고리-음료종류(기본이라고 표기한것)도 1 : N
관계이다.
음료의 크기는
이렇게 3가지 항목으로 볼 수 있다.
홈페이지를 확인해 보면 음료의 이름도 두가지 표기법이 있다.
이럴 경우 따로 names 라는 table을 만들어 FK 값으로 연결지어 줄 수도 있지만... 괜히 table 하나 더 만드느니 column으로 추가하기로 했다!
참고로 완벽한 정답은 없다! 단지 좀더 보편적이고, 많은 사람들이 사용할 수 있는 형태로 구조를 짜도록 항상 생각해야 한다. 그러기 위해선 다른사람들이 어떤 식으로 모델링을 하는지 많이 볼수록 좋다 (참고 사이트 : http://www.databaseanswers.org/data_models/index.htm)
채현님 글로 모델링 공부하고 갑니다ㅎㅎㅎ