cIonecoder / expedia

Expedia Clone Coding - Portfolio
0 stars 1 forks source link

Accommodation Schema #4

Open shbada opened 2 years ago

shbada commented 2 years ago

ACCOMMODATION (숙박업체)

CREATE TABLE ACCOMMODATION (
                               ID INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
                               ACCOMMODATION_NAME VARCHAR(255) NOT NULL COMMENT '숙박업체명',
                               ACCOMMODATION_TYPE VARCHAR(255) NOT NULL COMMENT '숙박업체 타입',
                               BIZNO VARCHAR(20) NOT NULL COMMENT '사업자번호',
                               COUNTRY_CD VARCHAR(255) NOT NULL COMMENT '국가코드',
                               CITY VARCHAR(255) NOT NULL COMMENT '시/도',
                               STATE VARCHAR(255) NOT NULL COMMENT '행정구역',
                               STREET VARCHAR(255) NOT NULL COMMENT '나머지주소',
                               ZIPCODE VARCHAR(255) NOT NULL COMMENT '우편번호',
                               CHECKIN_DESCRIPTION LONGTEXT COMMENT '체크인 상세설명',
                               CHECKIN_START_TIME TIME NOT NULL COMMENT '체크인 시작시간',
                               CHECKOUT_END_TIME TIME NOT NULL COMMENT '체크아웃 종료시간',
                               MIN_CHECKIN_AGE INTEGER NOT NULL COMMENT '체크인 가능 최소 나이',
                               RESPE_USER_ID BIGINT NOT NULL COMMENT '담당자 유저 인덱스',
                               RESPE_EMAIL VARCHAR(255) NOT NULL COMMENT '담당자 이메일',
                               RESPE_HPNO VARCHAR(20) NOT NULL COMMENT '담당자 휴대폰번호',
                               TEL_NO VARCHAR(20) NOT NULL COMMENT '숙박업체 전화번호',
                               LAST_MODIFIED_AT DATETIME(6) NOT NULL COMMENT '수정일자',
                               LAST_MODIFIED_BY INT(11) NOT NULL COMMENT '수정자',
                               CREATED_AT DATETIME(6) NOT NULL COMMENT '등록일자',
                               CREATED_BY INT(11) NOT NULL COMMENT '등록자',
                               FOREIGN KEY (RESPE_USER_ID) REFERENCES USERS(ID)
) DEFAULT character set utf8mb4 collate utf8mb4_unicode_ci;

ACCOMMODATION_TYPE (숙박업체 타입)

Enum

ACCOMMODATION_ROLE (숙박업체 권한)

CREATE TABLE ACCOMMODATION_ROLE (
                                   ID INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
                                   ACCOMMODATION_ID BIGINT NOT NULL COMMENT '숙박업체 인덱스',
                                   PROG_STATUS_CD BIGINT NOT NULL COMMENT '진행상태 코드',
                                   STOPPED_DTS DATETIME(6) COMMENT '중지일자',
                                   STOPPED_RSN LONGTEXT COMMENT '중지사유',
                                   LAST_MODIFIED_AT DATETIME(6) NOT NULL COMMENT '수정일자',
                                   LAST_MODIFIED_BY INT(11) NOT NULL COMMENT '수정자',
                                   CREATED_AT DATETIME(6) NOT NULL COMMENT '등록일자',
                                   CREATED_BY INT(11) NOT NULL COMMENT '등록자',
                                   FOREIGN KEY (ACCOMMODATION_ID) REFERENCES ACCOMMODATION(ID)
) DEFAULT character set utf8mb4 collate utf8mb4_unicode_ci;

ACCOMMODATION_ROOM (객실)

CREATE TABLE ACCOMMODATION_ROOM (
                                    ID INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
                                    ROOM_TYPE VARCHAR(255) NOT NULL COMMENT '객실 타입',
                                    ROOM_NAME VARCHAR(255) NOT NULL COMMENT '객실명',
                                    PRIORITY INTEGER NOT NULL COMMENT '객실 우선순위',
                                    MAX_ENTRANCT_CNT INTEGER NOT NULL COMMENT '투숙 가능 인원',
                                    STOCK INTEGER NOT NULL COMMENT '재고',
                                    ACCOMMODATION_ID BIGINT NOT NULL COMMENT '숙박업체 인덱스',
                                    LAST_MODIFIED_AT DATETIME(6) NOT NULL COMMENT '등록일자',
                                    LAST_MODIFIED_BY INT(11) NOT NULL COMMENT '수정자',
                                    CREATED_AT DATETIME(6) NOT NULL COMMENT '등록일자',
                                    CREATED_BY INT(11) NOT NULL COMMENT '등록자',
                                    FOREIGN KEY (ACCOMMODATION_ID) REFERENCES ACCOMMODATION(ID)
) DEFAULT character set utf8mb4 collate utf8mb4_unicode_ci;

ACCOMMODATION_GROUP_COMMON_CODE (숙박업체 그룹 공통코드)

CREATE TABLE ACCOMMODATION_GROUP_COMMON_CODE (
                                    ID INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
                                    GRP_CODE VARCHAR(5) UNIQUE,
                                    GRP_CODE_NAME VARCHAR(50) NOT NULL COMMENT '그룹코드명'
                                    GRP_CODE_DESC VARCHAR(200) NOT NULL COMMENT '그룹코드설명'
                                    LAST_MODIFIED_AT DATETIME(6) NOT NULL COMMENT '수정일자',
                                    LAST_MODIFIED_BY INTEGER NOT NULL COMMENT '수정자',
                                    CREATED_AT DATETIME(6) NOT NULL COMMENT '등록일자',
                                    CREATED_BY INTEGER NOT NULL COMMENT '등록자',
) DEFAULT character set utf8mb4 collate utf8mb4_unicode_ci;

ACCOMMODATION_COMMON_CODE (숙박업체 공통코드)

CREATE TABLE ACCOMMODATION_COMMON_CODE (
                                    ID INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
                                    CODE VARCHAR(10) UNIQUE,
                                    GRP_CODE_ID BIGINT NOT NULL COMMENT '숙박업체 그룹 공통코드 인덱스'
                                    CODE_NAME VARCHAR(50) NOT NULL COMMENT '코드명'
                                    CODE_DESC VARCHAR(200) NOT NULL COMMENT '코드설명'
                                    LAST_MODIFIED_AT DATETIME(6) NOT NULL COMMENT '수정일자',
                                    LAST_MODIFIED_BY INT(11) NOT NULL COMMENT '수정자',
                                    CREATED_AT DATETIME(6) NOT NULL COMMENT '등록일자',
                                    CREATED_BY INT(11) NOT NULL COMMENT '등록자',
                                    FOREIGN KEY (GRP_CODE_ID) REFERENCES ACCOMMODATION_GROUP_COMMON_CODE(ID)
) DEFAULT character set utf8mb4 collate utf8mb4_unicode_ci;

ACCOMMODATION_ROOM_INFO (객실 부가정보)

1) 침실 위치 침실 / 거실 / 기타공간 2) 숙소에서 이용할 수 있는 부가기능 (bar, 사우나, 무료 WIFI, 에어컨 등) 3) 숙소 정책 (흡연 가능 여부, 반려동물 동반 가능 여부 등)

CREATE TABLE ACCOMMODATION_ROOM_INFO (
                                    ID INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
                                    ACCOMMODATION_ROOM_ID BIGINT NOT NULL COMMENT '객실 인덱스',
                                    CODE_ID VARCHAR(10) NOT NULL COMMENT '숙박업체 공통코드 인덱스',
                                    ACTIVE TINYINT(1) NOT NULL COMMENT '공통코드 제공여부',
                                    LAST_MODIFIED_AT DATETIME(6) NOT NULL COMMENT '수정일자',
                                    LAST_MODIFIED_BY INT(11) NOT NULL COMMENT '수정자',
                                    CREATED_AT DATETIME(6) NOT NULL COMMENT '등록일자',
                                    CREATED_BY INT(11) NOT NULL COMMENT '등록자',
                                    FOREIGN KEY (ACCOMMODATION_ROOM_ID) REFERENCES ACCOMMODATION_ROOM(ID),
                                    FOREIGN KEY (CODE_ID) REFERENCES ACCOMMODATION_COMMON_CODE(ID)
) DEFAULT character set utf8mb4 collate utf8mb4_unicode_ci;

ACCOMMODATION_ROOM_FEE (객실 요금)

CREATE TABLE ACCOMMODATION_ROOM_FEE (
                                   ID INT(11) UNSIGNED AUTO_INCREMENT PRIMARY KEY,
                                   ACCOMMODATION_ROOM_ID BIGINT NOT NULL COMMENT '객실 인덱스',
                                   ACTIVE TINYINT(1) NOT NULL COMMENT '기본요금 설정 여부',
                                   FEE_NAME VARCHAR(255) NOT NULL COMMENT '객실 요금제명',
                                   FEE DECIMAL NOT NULL COMMENT '객실 요금',
                                   LAST_MODIFIED_AT DATETIME(6) NOT NULL COMMENT '수정일자',
                                   LAST_MODIFIED_BY INT(11) NOT NULL COMMENT '수정자',
                                   CREATED_AT DATETIME(6) NOT NULL COMMENT '등록일자',
                                   REATED_BY INT(11) NOT NULL COMMENT '등록자',
                                   FOREIGN KEY (ACCOMMODATION_ROOM_ID) REFERENCES ACCOMMODATION_ROOM(ID)
) DEFAULT character set utf8mb4 collate utf8mb4_unicode_ci;

테이블 관계

History

Aggregate

accommodation aggregate3

[3] accommodation aggregate3.png [Aggregate : ACCOMMODATION]

[Aggregate : ACCOMMODATION_GROUP_COMMON_CODE]

[Aggregate : ACCOMMODATION_COMMON_CODE]

BAEKJungHo commented 2 years ago

분석하느라 고생하셨어요 👍컬럼 부분은 이번 피드백에서는 최대한 Comment 안할게요 !

전체적으로 구성은 좋은 것 같아요. 다음 Step 에서는 피드백 참고해서 조금 더 디테일하게 진행 해보시면 좋을 것 같습니다 ㅎㅎ

피드백

질문

BAEKJungHo commented 2 years ago

시스템 컬럼 부분

현재 시스템 컬럼을 아래와 같이 사용 중이신데, Spring Data 에서 제공해주는 네이밍을 따라가는 건 어떨까요?

AS-IS

MOD_DTS DATETIME(6) NOT NULL COMMENT '등록일자',
MOD_USER_IDX INTEGER NOT NULL COMMENT '수정자',
REG_DTS DATETIME(6) NOT NULL COMMENT '등록일자',
REG_USER_IDX INTEGER NOT NULL COMMENT '등록자',

COMMENT 오타 수정 부탁드립니다 ㅎㅎ

TO-BE

CREATED_AT ~  등록일자
CREATED_BY ~ 등록자
LAST_MODIFIED_AT ~ 수정일자
LAST_MODIFIED_BY ~ 수정자

charset 누락

MYSQL 에서 charset 은 데이터베이스마다 설정을 어떻게 했는지에 따라 다르긴 한데, 예시로 아래와 같은 것들이 있습니다.

데이터베이스 기본 설정을 따라가도 상관은 없을 것 같아요 ㅎㅎ

관계 설정

FK 설정 부탁드립니다 :)

PK 부분도 IDX BIGINT NOT NULL, 이렇게 되어있는 부분 MYSQL 로 작성 부탁드려요 ㅎㅎ

숙박업체 권한 부분

해당 부분은 조금 더 진행되시고나서 피드백 드리겠습니다

객실과 객실 요금

개인적인 생각으로는 객실에는 객실마다 기본 요금이 있을 것 같고, 추가 옵션 처럼 관리되는 요금이 있을 것 같습니다 :)

BAEKJungHo commented 2 years ago

전체적으로 테이블 잘 짜주신 것 같아요 👍 👍 질문은 [Q] 로 표시해두겠습니다.

Accommodation

PK

IDX BIGINT PK 생성 부분 BIGINT 까지는 필요 없을 것 같습니다. 보통 INT(11) 정도에 unsigned 면 되지 않을까 생각합니다 :)

FK

RESPE_USER_IDX 부분은 나중에 PARTNER_CENTRAL_ID 로 바뀔 것 같습니다 :) 일단은 지금은 그대로 두셔도 될 것 같아요 ㅎㅎ

System Column

createdBy 와 lastModifiedBy 에 DEFAULT 'SYSTEM' 을 주는것은 어떨까요? 예외의 상황에는 DEFAULT 값이 들어가게끔 해주는것도 좋을 것 같습니다.

ACCOMMODATION_TYPE

테이블이 아닌 공통코드로 가져가도 될지?

ACCOMMODATION_TYPE 을 보면 FK 가 아무것도 안걸려있습니다. 숙박업체를 등록할때 타입을 먼저 선택하는데, ACCOMMODATION 쪽에 타입이 존재해야하지 않을까 생각합니다.

변경 가능성이 거의 없거나, 추가 되더라도 빈도가 엄청 낮은 경우에는 테이블로 관리하는 것도 괜찮고, 코드에서 Enum 으로 관리해도 충분하지 않을까 생각합니다.

개인적으로는 Enum 이 낫지 않을까 생각합니다. Table 로 빼는 순간 조회가 한 번 더 늘어나기도 하고 혹은 서로 테이블간 객체간 관계를 맺어줘야하기 때문에..

어차피 등록할때 타입을 선택하고, 타입은 ACCOMMODATION 에 들어가야할 것 습니다😄

ACCOMMODATION_ROLE

진행 상태 코드 : 승인(APPROVAL) 과 반려(DENY), 대기(PENDING)

ROLE 에 탈퇴와 관련된 코드를 하나 추가하면 어떨까요? SOFT DELETE 처럼 사용할 수 있을 것 같습니다. 그리고 정석적으로 한다면 ROLE 에 대한 HISTORY TABLE 이 하나 존재해야하긴 하지만 일단, 노가다성 작업이라고 생각돼서 빼고 진행하는거로 할게요 ㅎㅎ

진행 상태 코드를 권한쪽에다 관리하면, 일단 권한을 세세하게 가져갈 필요는 없겠네요. 단순히 내 숙박 업체가 어떤 상태인지만 체크하면 될 것 같네요 :) 👍

ACCOMMODATION_ROOM

우선순위 관련 컬럼은 PRIORITY 로 제안해 봅니다 😄 다른 테이블에서도 테이블명_ORDER 로 쓸 필요 없고 모든 우선순위 컬럼은 PRIORITY 로 통일하면 좋지 않을까 생각합니다.

ACCOMMODATION_GROUP_COMMON_CODE

GROUP_COMMON_CODE, COMMON_CODE 부분

코드값이 UNIQUE 하더라도 PK 는 인조키로 잡는게 좋습니다. 어떤일이 발생할지 모르기때문에 ㅎㅎ 저는 PK 를 인조키로 생성하고, 코드값에 UNIQUE INDEX 를 걸어줄 것 같습니다 😄

ACCOMMODATION_ROOM_INFO

GROUP_COMMON_CODE, COMMON_CODE, ROOM_INFO 되게 잘 풀어주신것 같아요 👍

CODE_VALUE(Y/N) 공통 코드 제공 관련 여부는 활성화 여부랑 같은 역할인 것 같은데 ACTIVE 로 통일하는게 어떨까 제안합니다. Y/N 값을 갖는 컬럼을 CODE_VALUE 로 한다면, 코드에서는 String 타입으로 받아야 하고 아래와 같이 코딩이 되겠죠?

String codeValue;

그러면 다른 사람이 봤을때 codeValue 가 뭔지 짐작하지 못할 것 같습니다. 물론 @Column 을 사용하여 필드명을 다른 것으로 바꿔줄 수 있겠지만, boolean 값을 받는 ACTIVE 컬럼으로 통일하면 좋지 않을까 생각합니다.

boolean active

이러한 이유 때문에 개인적으로 YN 컬럼을 별로 좋아하지 않습니다 😅

ACCOMMODATION_ROOM_FEE

여기도 Y/N 컬럼에 대해서는 ACTIVE 라는 명칭을 사용하면 어떨까 생각합니다.

오타

몇개 LAST_MODIFIED_AT DATETIME(6) NOT NULL COMMENT '등록일자', 이런식으로 컬럼과 COMMENT 가 매칭이 안되는 부분이 있습니다 :)

CREATED_BY INTEGER NOT NULL COMMENT '등록자', 이런식으로 INTEGER 로 되어있는 오타도 있습니다.

시스템 컬럼 위주로 한번 훑어봐주시면 좋을 것 같아요

shbada commented 2 years ago

[Q] https://github.com/cIonecoder/expedia/issues/2#issuecomment-1101482129 서해님 생각도 궁금하네요 ㅎㅎ. IDX 랑 ID 어떤 네이밍이 더 좋을지, 서해님 생각이 궁금합니다.

  • 저도 이건 단순히 명칭 차이로, 어떻게 관리하느냐인거 같아요! 그래서 IDX, ID 중 어느 것으로 갈지 통일하면 될것같습니다 ㅎㅎ

IDX BIGINT PK 생성 부분 BIGINT 까지는 필요 없을 것 같습니다. 보통 INT(11) 정도에 unsigned 면 되지 않을까 생각합니다 :)

  • 넵! 조언 감사합니다~

createdBy 와 lastModifiedBy 에 DEFAULT 'SYSTEM' 을 주는것은 어떨까요?

[질문]

  • 제가 생각한 createdBy, lastModifiedBy 에는 USER_ACCOUNT 테이블의 id 로 생각했거든요! 'SYSTEM' 이라 하시면, USER_ACCOUNT, USER_INFO 테이블의 어떤 컬럼값을 말씀하시는 건가요?!
  • https://github.com/cIonecoder/expedia/issues/2

ACCOMMODATION_TYPE 을 보면 FK 가 아무것도 안걸려있습니다. 숙박업체를 등록할때 타입을 먼저 선택하는데, ACCOMMODATION 쪽에 타입이 존재해야하지 않을까 생각합니다. 권한 테이블을 보면 타입을 FK 로 잡고있는데, 어떤 이유에서 위 처럼 설계한 것인지 궁금합니다

  • 우선 이 테이블은 enum, code table 중에 어떤걸로 갈지는 좀더 고민해보겠습니다 ㅎㅎ
  • FK가 없던 이유는, ACCOMMODATION_ROLE 에서 관리되기 때문이였습니다~ ACCOMMODATION_TYPE 의 코드를 select box 로 보여줄테고, 이 중에 선택된 데이터와 진행상태가 ACCOMMODATION_ROLE에 들어가는 방향으로 생각했고, 하나의 숙박업체의 유형이 여러개일 수 있다고 생각했는데 야놀자/Expedia 등을 보니, 여러 타입을 가지고있진 않은것으로 확인되서 이부분은 수정했습니다!
BAEKJungHo commented 2 years ago

저도 이건 단순히 명칭 차이로, 어떻게 관리하느냐인거 같아요! 그래서 IDX, ID 중 어느 것으로 갈지 통일하면 될것같습니다 ㅎㅎ

그러면 ID 로 통일하는 거로 하겠습니다 :)

제가 생각한 createdBy, lastModifiedBy 에는 USER_ACCOUNT 테이블의 id 로 생각했거든요! 'SYSTEM' 이라 하시면, USER_ACCOUNT, USER_INFO 테이블의 어떤 컬럼값을 말씀하시는 건가요?!

id 값이 맞는데 만약에 id 값이 안들어가지거나(버그 등으로 인해) 혹은 개발자(시스템 관리자라고 할게요) 가 수정하는 경우나? 그런 경우에 DEFAULT 값이 있어야 하지 않을까 해서 말씀드렸습니다 ㅎㅎ

CREATED_BY INT(11) NOT NULL DEFAULT 'SYSTEM' COMMENT '등록자',

ACCOMODATION_ROLE

STOPPED_DTS DATETIME(6) COMMENT '중지일자',
STOPPED_RSN LONGTEXT COMMENT '중지사유',

이 두 컬럼은 뭔가 히스토리 테이블에 있어야 어울릴 것 같은데, 빼도 되지 않을까요? History table 을 안쓰니까, 추가하신거면 상관은 없을 것 같습니다 :)

shbada commented 2 years ago

그러면 ID 로 통일하는 거로 하겠습니다 :)

넵! 이건 수정했습니다~

id 값이 맞는데 만약에 id 값이 안들어가지거나(버그 등으로 인해) 혹은 개발자(시스템 관리자라고 할게요) 가 수정하는 경우나? 그런 경우에 DEFAULT 값이 있어야 하지 않을까 해서 말씀드렸습니다 ㅎㅎ

아하 근데 만약 id 값이 들어갈 수가 없거나, 빈 값이라면 에러 발생이 맞지 않을까여? DEFAULT 지정하면 에러 없이 'SYSTEM'으로 데이터가 삽입될거 같아서 이 점은 운영으로 가져갈시에는 설정하지 않는게 낫지 않을까 라는 생각이 들어요! 시스템 관리자가 직접 수기/수정할 때에도 개인의 사번 등으로 직접 문자열을 넣지않을까요?!

이 두 컬럼은 뭔가 히스토리 테이블에 있어야 어울릴 것 같은데, 빼도 되지 않을까요? History table 을 안쓰니까, 추가하신거면 상관은 없을 것 같습니다 :)

숙박업체가 중지 상태로 변경됬을때 데이터를 넣어두려고 추가했습니다! 히스토리 테이블을 안써서 추가한거 맞아요!ㅎㅎ

shbada commented 2 years ago

Aggregate 확정 과정

Aggregate

첫번째

accommodation aggregate1

[1] accommodation aggregate1.png [Aggregate : ACCOMMODATION]

Aggregate Root : ACCOMMODATION 1) ACCOMMODATION_ROLE 2) ACCOMMODATION_ROOM 2-1) ACCOMMODATION_ROOM_INFO 2-2) ACCOMMODATION_ROOM_FEE 3) ACCOMMODATION_GROUP_COMMON_CODE 3-1) ACCOMMODATION_COMMON_CODE

두번째

accommodation aggregate2

[2] accommodation aggregate2.png [Aggregate : ACCOMMODATION]

Aggregate Root : ACCOMMODATION ACCOMMODATION_ROLE ACCOMMODATION_ROOM 2-1) ACCOMMODATION_ROOM_INFO 2-2) ACCOMMODATION_ROOM_FEE

[Aggregate : ACCOMMODATION_GROUP_COMMON_CODE]

Aggregate Root : ACCOMMODATION_GROUP_COMMON_CODE 1) ACCOMMODATION_COMMON_CODE

세번째 - 확정

accommodation aggregate3

[3] accommodation aggregate3.png [Aggregate : ACCOMMODATION]

[Aggregate : ACCOMMODATION_GROUP_COMMON_CODE]

[Aggregate : ACCOMMODATION_COMMON_CODE]


1) 같은 Aggregate에 속한 구성요소는 대부분 함께 생성되고 함께 제거된다. -> 숙박업체 공통코드 테이블이지만 숙박업체의 데이터에 따라 변경되는 데이터는 아닌거같다고 생각했어요! 2) 'A가 B를 갖는다' 로 설계할 수 있는 요구사항이 있더라도 이것이 반드시 A와 B가 한 Aggregate에 속한다는 것을 의미 하는 것은 아니다. -> 숙박업체가 숙박업체 공통코드 데이터를 갖고있지만, 함께 생성되고 삭제된느 데이터가 아니므로 반드시 한 Aggregate에 포함되지 않을 수 있다. 3) ACCOMMODATION_GROUP_COMMON_CODE 테이블이랑 ACCOMMODATION_COMMON_CODE 테이블 분리 -> ACCOMMODATION_GROUP_COMMON_CODE 테이블이랑 ACCOMMODATION_COMMON_CODE 테이블이 숙박업체 그룹 공통코드 (ACCOMMODATION_GROUP_COMMON_CODE) : 숙박업체 공통코드 (ACCOMMODATION_COMMON_CODE) = 1 : N

연관관계는 가지고있지만 같은 라이프사이클을 가졌다기에는 애매하고, 별도로 관리되는 테이블 데이터라고 생각해서 각각의 Aggregate로 분리

BAEKJungHo commented 2 years ago

고생하셨습니다 ~ 👏👏👏

ATDD 하러 가시죠 ~