CareCode 프로젝트는 돌봄 시설, 커뮤니티, 건강 관리, 정책 정보, 알림, 챗봇 등 다양한 도메인을 포함하는 종합 돌봄 플랫폼입니다.
- 사용자 관리 (User): 회원 정보, 자녀 정보, 인증
- 돌봄 시설 (CareFacility): 시설 정보, 예약, 리뷰
- 커뮤니티 (Community): 게시글, 댓글, 태그, 좋아요, 북마크
- 건강 관리 (Health): 병원 정보, 건강 기록, 리뷰
- 정책 (Policy): 정책 정보, 카테고리, 문서
- 알림 (Notification): 알림, 템플릿, 사용자 설정
- 챗봇 (Chatbot): 채팅 세션, 메시지
- 총 테이블 수: 25개
- 총 관계 수: 40+ 개
- 인덱스: 50+ 개
- 제약조건: 30+ 개
erDiagram
%% ==========================================
%% 사용자 도메인 (User Domain)
%% ==========================================
TBL_USER {
BIGINT ID PK
VARCHAR USER_ID UK
VARCHAR EMAIL UK
VARCHAR PASSWORD
VARCHAR NAME
VARCHAR PHONE_NUMBER
DATE BIRTH_DATE
ENUM GENDER
VARCHAR ADDRESS
DOUBLE LATITUDE
DOUBLE LONGITUDE
VARCHAR PROFILE_IMAGE_URL
ENUM ROLE
VARCHAR PROVIDER
VARCHAR PROVIDER_ID
BOOLEAN IS_ACTIVE
BOOLEAN EMAIL_VERIFIED
BOOLEAN REGISTRATION_COMPLETED
DATETIME DELETED_AT
DATETIME LAST_LOGIN_AT
DATETIME CREATED_AT
DATETIME UPDATED_AT
}
TBL_CHILD {
BIGINT ID PK
BIGINT USER_ID FK
VARCHAR NAME
DATE BIRTH_DATE
ENUM GENDER
TEXT SPECIAL_NOTES
DATETIME CREATED_AT
DATETIME UPDATED_AT
}
TBL_EMAIL_VERIFICATION_TOKEN {
BIGINT ID PK
BIGINT USER_ID FK
VARCHAR TOKEN UK
DATETIME EXPIRES_AT
BOOLEAN VERIFIED
DATETIME CREATED_AT
}
%% ==========================================
%% 돌봄 시설 도메인 (CareFacility Domain)
%% ==========================================
TBL_CARE_FACILITY {
BIGINT ID PK
VARCHAR FACILITY_ID UK
VARCHAR NAME
VARCHAR TYPE
VARCHAR ADDRESS
DOUBLE LATITUDE
DOUBLE LONGITUDE
VARCHAR PHONE_NUMBER
VARCHAR WEBSITE
TEXT DESCRIPTION
INTEGER CAPACITY
VARCHAR OPERATING_HOURS
TEXT FACILITIES
DECIMAL AVG_RATING
INTEGER REVIEW_COUNT
BOOLEAN IS_ACTIVE
DATETIME CREATED_AT
DATETIME UPDATED_AT
}
TBL_CARE_FACILITY_BOOKING {
BIGINT ID PK
BIGINT USER_ID FK
BIGINT CARE_FACILITY_ID FK
BIGINT CHILD_ID FK
DATE BOOKING_DATE
TIME START_TIME
TIME END_TIME
ENUM STATUS
TEXT NOTES
TEXT CANCELLATION_REASON
DATETIME CANCELLED_AT
DATETIME CREATED_AT
DATETIME UPDATED_AT
}
TBL_REVIEW {
BIGINT ID PK
BIGINT USER_ID FK
BIGINT CARE_FACILITY_ID FK
INTEGER RATING
TEXT CONTENT
DATETIME CREATED_AT
DATETIME UPDATED_AT
}
%% ==========================================
%% 커뮤니티 도메인 (Community Domain)
%% ==========================================
TBL_POST {
BIGINT ID PK
VARCHAR TITLE
TEXT CONTENT
ENUM CATEGORY
ENUM STATUS
BIGINT AUTHOR_ID FK
VARCHAR AUTHOR_NAME
BOOLEAN IS_ANONYMOUS
INTEGER VIEW_COUNT
INTEGER LIKE_COUNT
INTEGER COMMENT_COUNT
BOOLEAN IS_PINNED
DATETIME CREATED_AT
DATETIME UPDATED_AT
}
TBL_COMMENT {
BIGINT ID PK
BIGINT POST_ID FK
BIGINT AUTHOR_ID FK
VARCHAR AUTHOR_NAME
TEXT CONTENT
BIGINT PARENT_COMMENT_ID FK
INTEGER LIKE_COUNT
DATETIME CREATED_AT
DATETIME UPDATED_AT
}
TBL_TAG {
BIGINT ID PK
VARCHAR NAME UK
TEXT DESCRIPTION
INTEGER USE_COUNT
DATETIME CREATED_AT
}
TBL_POST_TAG {
BIGINT POST_ID FK
BIGINT TAG_ID FK
}
TBL_POST_LIKE {
BIGINT ID PK
BIGINT POST_ID FK
BIGINT USER_ID FK
DATETIME CREATED_AT
}
TBL_BOOKMARK {
BIGINT ID PK
BIGINT POST_ID FK
BIGINT USER_ID FK
DATETIME CREATED_AT
}
%% ==========================================
%% 건강 도메인 (Health Domain)
%% ==========================================
TBL_HOSPITAL {
BIGINT ID PK
VARCHAR HOSPITAL_ID UK
VARCHAR NAME
VARCHAR TYPE
VARCHAR ADDRESS
DOUBLE LATITUDE
DOUBLE LONGITUDE
VARCHAR PHONE_NUMBER
VARCHAR WEBSITE
TEXT DESCRIPTION
VARCHAR OPERATING_HOURS
TEXT DEPARTMENTS
DECIMAL AVG_RATING
INTEGER REVIEW_COUNT
INTEGER LIKE_COUNT
BOOLEAN IS_ACTIVE
DATETIME CREATED_AT
DATETIME UPDATED_AT
}
TBL_HOSPITAL_REVIEW {
BIGINT ID PK
BIGINT USER_ID FK
BIGINT HOSPITAL_ID FK
INTEGER RATING
TEXT CONTENT
VARCHAR DEPARTMENT
DATETIME VISIT_DATE
INTEGER LIKE_COUNT
DATETIME CREATED_AT
DATETIME UPDATED_AT
}
TBL_HOSPITAL_LIKE {
BIGINT ID PK
BIGINT USER_ID FK
BIGINT HOSPITAL_ID FK
DATETIME CREATED_AT
}
TBL_HEALTH_RECORD {
BIGINT ID PK
BIGINT USER_ID FK
BIGINT CHILD_ID FK
ENUM RECORD_TYPE
DATE RECORD_DATE
VARCHAR TITLE
TEXT DESCRIPTION
DECIMAL HEIGHT
DECIMAL WEIGHT
DECIMAL TEMPERATURE
TEXT SYMPTOMS
TEXT DIAGNOSIS
TEXT TREATMENT
TEXT MEDICATION
TEXT NOTES
DATETIME CREATED_AT
DATETIME UPDATED_AT
}
TBL_HEALTH_RECORD_ATTACHMENT {
BIGINT ID PK
BIGINT HEALTH_RECORD_ID FK
VARCHAR FILE_NAME
VARCHAR FILE_PATH
VARCHAR FILE_TYPE
BIGINT FILE_SIZE
DATETIME CREATED_AT
}
%% ==========================================
%% 정책 도메인 (Policy Domain)
%% ==========================================
TBL_POLICY_CATEGORY {
BIGINT ID PK
VARCHAR NAME UK
TEXT DESCRIPTION
INTEGER DISPLAY_ORDER
DATETIME CREATED_AT
DATETIME UPDATED_AT
}
TBL_POLICY {
BIGINT ID PK
VARCHAR POLICY_ID UK
BIGINT CATEGORY_ID FK
VARCHAR TITLE
TEXT DESCRIPTION
TEXT CONTENT
VARCHAR TARGET_AUDIENCE
TEXT ELIGIBILITY
TEXT BENEFITS
TEXT APPLICATION_METHOD
VARCHAR CONTACT_INFO
VARCHAR RELATED_LINK
DATE START_DATE
DATE END_DATE
ENUM STATUS
INTEGER VIEW_COUNT
INTEGER BOOKMARK_COUNT
DATETIME CREATED_AT
DATETIME UPDATED_AT
}
TBL_POLICY_DOCUMENT {
BIGINT ID PK
BIGINT POLICY_ID FK
VARCHAR DOCUMENT_NAME
VARCHAR DOCUMENT_PATH
VARCHAR DOCUMENT_TYPE
BIGINT FILE_SIZE
DATETIME CREATED_AT
}
%% ==========================================
%% 알림 도메인 (Notification Domain)
%% ==========================================
TBL_NOTIFICATION {
BIGINT ID PK
BIGINT USER_ID FK
VARCHAR TITLE
TEXT CONTENT
ENUM TYPE
VARCHAR RELATED_ID
VARCHAR RELATED_TYPE
BOOLEAN IS_READ
DATETIME READ_AT
DATETIME CREATED_AT
}
TBL_NOTIFICATION_TEMPLATE {
BIGINT ID PK
VARCHAR TEMPLATE_ID UK
VARCHAR NAME
VARCHAR TITLE
TEXT CONTENT
ENUM TYPE
TEXT VARIABLES
BOOLEAN IS_ACTIVE
DATETIME CREATED_AT
DATETIME UPDATED_AT
}
TBL_NOTIFICATION_PREFERENCE {
BIGINT ID PK
BIGINT USER_ID FK
ENUM NOTIFICATION_TYPE UK
BOOLEAN EMAIL_ENABLED
BOOLEAN PUSH_ENABLED
BOOLEAN SMS_ENABLED
DATETIME CREATED_AT
DATETIME UPDATED_AT
}
TBL_NOTIFICATION_SETTINGS {
BIGINT ID PK
BIGINT USER_ID FK
BOOLEAN EMAIL_NOTIFICATIONS
BOOLEAN PUSH_NOTIFICATIONS
BOOLEAN SMS_NOTIFICATIONS
BOOLEAN MARKETING_NOTIFICATIONS
BOOLEAN NIGHT_MODE
TIME QUIET_TIME_START
TIME QUIET_TIME_END
DATETIME CREATED_AT
DATETIME UPDATED_AT
}
%% ==========================================
%% 챗봇 도메인 (Chatbot Domain)
%% ==========================================
TBL_CHAT_SESSION {
BIGINT ID PK
VARCHAR SESSION_ID UK
BIGINT USER_ID FK
VARCHAR TITLE
ENUM STATUS
DATETIME STARTED_AT
DATETIME ENDED_AT
DATETIME CREATED_AT
DATETIME UPDATED_AT
}
TBL_CHAT_MESSAGE {
BIGINT ID PK
BIGINT SESSION_ID FK
ENUM SENDER_TYPE
TEXT MESSAGE
TEXT RESPONSE
BOOLEAN IS_HELPFUL
DATETIME CREATED_AT
}
%% ==========================================
%% 관계 정의 (Relationships)
%% ==========================================
%% User Domain Relationships
TBL_USER ||--o{ TBL_CHILD : "has"
TBL_USER ||--o| TBL_EMAIL_VERIFICATION_TOKEN : "has"
TBL_USER ||--o{ TBL_POST : "writes"
TBL_USER ||--o{ TBL_COMMENT : "writes"
TBL_USER ||--o{ TBL_POST_LIKE : "likes"
TBL_USER ||--o{ TBL_BOOKMARK : "bookmarks"
TBL_USER ||--o{ TBL_REVIEW : "writes"
TBL_USER ||--o{ TBL_CARE_FACILITY_BOOKING : "books"
TBL_USER ||--o{ TBL_HOSPITAL_REVIEW : "writes"
TBL_USER ||--o{ TBL_HOSPITAL_LIKE : "likes"
TBL_USER ||--o{ TBL_HEALTH_RECORD : "creates"
TBL_USER ||--o{ TBL_NOTIFICATION : "receives"
TBL_USER ||--o{ TBL_NOTIFICATION_PREFERENCE : "has"
TBL_USER ||--o| TBL_NOTIFICATION_SETTINGS : "has"
TBL_USER ||--o{ TBL_CHAT_SESSION : "starts"
%% CareFacility Domain Relationships
TBL_CARE_FACILITY ||--o{ TBL_REVIEW : "has"
TBL_CARE_FACILITY ||--o{ TBL_CARE_FACILITY_BOOKING : "accepts"
TBL_CHILD ||--o{ TBL_CARE_FACILITY_BOOKING : "booked_for"
TBL_CHILD ||--o{ TBL_HEALTH_RECORD : "has"
%% Community Domain Relationships
TBL_POST ||--o{ TBL_COMMENT : "has"
TBL_POST ||--o{ TBL_POST_LIKE : "receives"
TBL_POST ||--o{ TBL_BOOKMARK : "has"
TBL_POST }o--o{ TBL_TAG : "tagged_with"
TBL_COMMENT ||--o{ TBL_COMMENT : "replies_to"
%% Health Domain Relationships
TBL_HOSPITAL ||--o{ TBL_HOSPITAL_REVIEW : "has"
TBL_HOSPITAL ||--o{ TBL_HOSPITAL_LIKE : "receives"
TBL_HEALTH_RECORD ||--o{ TBL_HEALTH_RECORD_ATTACHMENT : "has"
%% Policy Domain Relationships
TBL_POLICY_CATEGORY ||--o{ TBL_POLICY : "categorizes"
TBL_POLICY ||--o{ TBL_POLICY_DOCUMENT : "has"
%% Chatbot Domain Relationships
TBL_CHAT_SESSION ||--o{ TBL_CHAT_MESSAGE : "contains"
설명: 시스템의 모든 사용자 정보를 저장하는 중심 테이블
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 사용자 고유 식별자 |
| USER_ID | VARCHAR(50) | UNIQUE, NOT NULL | 사용자 ID (자동 생성) |
| VARCHAR(100) | UNIQUE, NOT NULL | 이메일 주소 | |
| PASSWORD | VARCHAR(255) | NULL | 비밀번호 (OAuth 사용자는 NULL) |
| NAME | VARCHAR(50) | NOT NULL | 이름 |
| PHONE_NUMBER | VARCHAR(20) | NULL | 전화번호 |
| BIRTH_DATE | DATE | NULL | 생년월일 |
| GENDER | ENUM | NULL | 성별 (MALE, FEMALE, OTHER) |
| ADDRESS | VARCHAR(255) | NULL | 주소 |
| LATITUDE | DOUBLE | NULL | 위도 |
| LONGITUDE | DOUBLE | NULL | 경도 |
| PROFILE_IMAGE_URL | VARCHAR(500) | NULL | 프로필 이미지 URL |
| ROLE | ENUM | NOT NULL | 사용자 역할 (PARENT, CAREGIVER, ADMIN, GUEST) |
| PROVIDER | VARCHAR(20) | NULL | OAuth 제공자 (kakao, google, naver) |
| PROVIDER_ID | VARCHAR(100) | NULL | OAuth 제공자의 사용자 ID |
| IS_ACTIVE | BOOLEAN | NOT NULL, DEFAULT TRUE | 활성 상태 |
| EMAIL_VERIFIED | BOOLEAN | NOT NULL, DEFAULT FALSE | 이메일 인증 여부 |
| REGISTRATION_COMPLETED | BOOLEAN | NOT NULL, DEFAULT FALSE | 가입 프로세스 완료 여부 |
| DELETED_AT | DATETIME | NULL | 소프트 삭제 시간 |
| LAST_LOGIN_AT | DATETIME | NULL | 마지막 로그인 시간 |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
| UPDATED_AT | DATETIME | NULL | 수정 시간 |
인덱스:
idx_user_email: 이메일 검색 최적화idx_user_provider: OAuth 제공자별 검색idx_user_role: 역할별 검색idx_user_created_at: 가입일 기준 정렬
설명: 사용자의 자녀 정보를 저장
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 자녀 고유 식별자 |
| USER_ID | BIGINT | FK, NOT NULL | 부모 사용자 ID |
| NAME | VARCHAR(50) | NOT NULL | 자녀 이름 |
| BIRTH_DATE | DATE | NULL | 생년월일 |
| GENDER | ENUM | NULL | 성별 (MALE, FEMALE, OTHER) |
| SPECIAL_NOTES | TEXT | NULL | 특이사항 (알레르기, 건강 상태 등) |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
| UPDATED_AT | DATETIME | NULL | 수정 시간 |
관계:
- User (1:N) - 한 사용자는 여러 자녀를 가질 수 있음
설명: 이메일 인증을 위한 토큰 저장
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 토큰 고유 식별자 |
| USER_ID | BIGINT | FK, NOT NULL | 사용자 ID |
| TOKEN | VARCHAR(255) | UNIQUE, NOT NULL | 인증 토큰 |
| EXPIRES_AT | DATETIME | NOT NULL | 만료 시간 |
| VERIFIED | BOOLEAN | NOT NULL, DEFAULT FALSE | 인증 완료 여부 |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
관계:
- User (1:1) - 한 사용자는 하나의 활성 토큰을 가짐
설명: 어린이집, 유치원 등 돌봄 시설 정보
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 시설 고유 식별자 |
| FACILITY_ID | VARCHAR(50) | UNIQUE, NOT NULL | 시설 ID |
| NAME | VARCHAR(200) | NOT NULL | 시설명 |
| TYPE | VARCHAR(50) | NULL | 시설 유형 (어린이집, 유치원 등) |
| ADDRESS | VARCHAR(500) | NULL | 주소 |
| LATITUDE | DOUBLE | NULL | 위도 |
| LONGITUDE | DOUBLE | NULL | 경도 |
| PHONE_NUMBER | VARCHAR(20) | NULL | 전화번호 |
| WEBSITE | VARCHAR(500) | NULL | 웹사이트 |
| DESCRIPTION | TEXT | NULL | 상세 설명 |
| CAPACITY | INT | NULL | 수용 인원 |
| OPERATING_HOURS | VARCHAR(100) | NULL | 운영 시간 |
| FACILITIES | TEXT | NULL | 편의시설 정보 |
| AVG_RATING | DECIMAL(3,2) | DEFAULT 0.0 | 평균 평점 |
| REVIEW_COUNT | INT | DEFAULT 0 | 리뷰 수 |
| IS_ACTIVE | BOOLEAN | NOT NULL, DEFAULT TRUE | 운영 여부 |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
| UPDATED_AT | DATETIME | NULL | 수정 시간 |
인덱스:
idx_care_facility_name: 시설명 검색idx_care_facility_type: 시설 유형별 검색idx_care_facility_location: 위치 기반 검색 (SPATIAL)idx_care_facility_rating: 평점 정렬
설명: 돌봄 시설 예약 정보
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 예약 고유 식별자 |
| USER_ID | BIGINT | FK, NOT NULL | 예약한 사용자 ID |
| CARE_FACILITY_ID | BIGINT | FK, NOT NULL | 시설 ID |
| CHILD_ID | BIGINT | FK, NULL | 자녀 ID |
| BOOKING_DATE | DATE | NOT NULL | 예약 날짜 |
| START_TIME | TIME | NULL | 시작 시간 |
| END_TIME | TIME | NULL | 종료 시간 |
| STATUS | ENUM | NOT NULL | 예약 상태 (PENDING, CONFIRMED, CANCELLED, COMPLETED) |
| NOTES | TEXT | NULL | 특이사항 |
| CANCELLATION_REASON | TEXT | NULL | 취소 사유 |
| CANCELLED_AT | DATETIME | NULL | 취소 시간 |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
| UPDATED_AT | DATETIME | NULL | 수정 시간 |
관계:
- User (N:1) - 사용자가 여러 예약을 할 수 있음
- CareFacility (N:1) - 시설에 여러 예약이 있을 수 있음
- Child (N:1) - 자녀별 예약
설명: 돌봄 시설에 대한 사용자 리뷰
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 리뷰 고유 식별자 |
| USER_ID | BIGINT | FK, NOT NULL | 작성자 ID |
| CARE_FACILITY_ID | BIGINT | FK, NOT NULL | 시설 ID |
| RATING | INT | NOT NULL | 평점 (1-5) |
| CONTENT | TEXT | NULL | 리뷰 내용 |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
| UPDATED_AT | DATETIME | NULL | 수정 시간 |
관계:
- User (N:1) - 사용자가 여러 리뷰 작성
- CareFacility (N:1) - 시설이 여러 리뷰를 받음
설명: 커뮤니티 게시글
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 게시글 고유 식별자 |
| TITLE | VARCHAR(200) | NOT NULL | 제목 |
| CONTENT | TEXT | NOT NULL | 내용 |
| CATEGORY | ENUM | NOT NULL | 카테고리 (GENERAL, QUESTION, SHARE, REVIEW, NEWS, EVENT, NOTICE) |
| STATUS | ENUM | NOT NULL | 상태 (DRAFT, PUBLISHED, HIDDEN, DELETED) |
| AUTHOR_ID | BIGINT | FK, NOT NULL | 작성자 ID |
| AUTHOR_NAME | VARCHAR(50) | NULL | 작성자 이름 (익명 가능) |
| IS_ANONYMOUS | BOOLEAN | DEFAULT FALSE | 익명 여부 |
| VIEW_COUNT | INT | DEFAULT 0 | 조회수 |
| LIKE_COUNT | INT | DEFAULT 0 | 좋아요 수 |
| COMMENT_COUNT | INT | DEFAULT 0 | 댓글 수 |
| IS_PINNED | BOOLEAN | DEFAULT FALSE | 고정 여부 |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
| UPDATED_AT | DATETIME | NULL | 수정 시간 |
인덱스:
idx_post_category: 카테고리별 검색idx_post_status: 상태별 검색idx_post_author: 작성자별 검색idx_post_created_at: 작성일 정렬
설명: 게시글 댓글 및 대댓글
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 댓글 고유 식별자 |
| POST_ID | BIGINT | FK, NOT NULL | 게시글 ID |
| AUTHOR_ID | BIGINT | FK, NOT NULL | 작성자 ID |
| AUTHOR_NAME | VARCHAR(50) | NULL | 작성자 이름 |
| CONTENT | TEXT | NOT NULL | 댓글 내용 |
| PARENT_COMMENT_ID | BIGINT | FK, NULL | 상위 댓글 ID (대댓글인 경우) |
| LIKE_COUNT | INT | DEFAULT 0 | 좋아요 수 |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
| UPDATED_AT | DATETIME | NULL | 수정 시간 |
관계:
- Post (N:1) - 게시글에 여러 댓글
- Comment (1:N) - 댓글에 여러 대댓글 (Self-referencing)
설명: 게시글 태그
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 태그 고유 식별자 |
| NAME | VARCHAR(50) | UNIQUE, NOT NULL | 태그명 |
| DESCRIPTION | TEXT | NULL | 태그 설명 |
| USE_COUNT | INT | DEFAULT 0 | 사용 횟수 |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
설명: 게시글과 태그의 다대다 관계 매핑
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| POST_ID | BIGINT | FK, PK | 게시글 ID |
| TAG_ID | BIGINT | FK, PK | 태그 ID |
관계:
- Post (M:N) Tag - 게시글과 태그는 다대다 관계
설명: 게시글에 대한 사용자 좋아요
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 고유 식별자 |
| POST_ID | BIGINT | FK, NOT NULL | 게시글 ID |
| USER_ID | BIGINT | FK, NOT NULL | 사용자 ID |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
제약조건: UNIQUE(POST_ID, USER_ID) - 중복 좋아요 방지
설명: 게시글 북마크
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 고유 식별자 |
| POST_ID | BIGINT | FK, NOT NULL | 게시글 ID |
| USER_ID | BIGINT | FK, NOT NULL | 사용자 ID |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
제약조건: UNIQUE(POST_ID, USER_ID) - 중복 북마크 방지
설명: 병원 및 의료기관 정보
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 병원 고유 식별자 |
| HOSPITAL_ID | VARCHAR(50) | UNIQUE, NOT NULL | 병원 ID |
| NAME | VARCHAR(200) | NOT NULL | 병원명 |
| TYPE | VARCHAR(50) | NULL | 병원 유형 (종합병원, 소아과 등) |
| ADDRESS | VARCHAR(500) | NULL | 주소 |
| LATITUDE | DOUBLE | NULL | 위도 |
| LONGITUDE | DOUBLE | NULL | 경도 |
| PHONE_NUMBER | VARCHAR(20) | NULL | 전화번호 |
| WEBSITE | VARCHAR(500) | NULL | 웹사이트 |
| DESCRIPTION | TEXT | NULL | 상세 설명 |
| OPERATING_HOURS | VARCHAR(100) | NULL | 운영 시간 |
| DEPARTMENTS | TEXT | NULL | 진료 과목 |
| AVG_RATING | DECIMAL(3,2) | DEFAULT 0.0 | 평균 평점 |
| REVIEW_COUNT | INT | DEFAULT 0 | 리뷰 수 |
| LIKE_COUNT | INT | DEFAULT 0 | 좋아요 수 |
| IS_ACTIVE | BOOLEAN | NOT NULL, DEFAULT TRUE | 운영 여부 |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
| UPDATED_AT | DATETIME | NULL | 수정 시간 |
인덱스:
idx_hospital_name: 병원명 검색idx_hospital_type: 병원 유형별 검색idx_hospital_location: 위치 기반 검색
설명: 병원에 대한 사용자 리뷰
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 리뷰 고유 식별자 |
| USER_ID | BIGINT | FK, NOT NULL | 작성자 ID |
| HOSPITAL_ID | BIGINT | FK, NOT NULL | 병원 ID |
| RATING | INT | NOT NULL | 평점 (1-5) |
| CONTENT | TEXT | NULL | 리뷰 내용 |
| DEPARTMENT | VARCHAR(100) | NULL | 진료 과목 |
| VISIT_DATE | DATETIME | NULL | 방문 날짜 |
| LIKE_COUNT | INT | DEFAULT 0 | 좋아요 수 |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
| UPDATED_AT | DATETIME | NULL | 수정 시간 |
설명: 병원에 대한 사용자 좋아요
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 고유 식별자 |
| USER_ID | BIGINT | FK, NOT NULL | 사용자 ID |
| HOSPITAL_ID | BIGINT | FK, NOT NULL | 병원 ID |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
제약조건: UNIQUE(USER_ID, HOSPITAL_ID) - 중복 좋아요 방지
설명: 자녀의 건강 기록 및 진료 기록
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 기록 고유 식별자 |
| USER_ID | BIGINT | FK, NOT NULL | 사용자 ID (부모) |
| CHILD_ID | BIGINT | FK, NULL | 자녀 ID |
| RECORD_TYPE | ENUM | NOT NULL | 기록 유형 (CHECKUP, VACCINATION, ILLNESS, GROWTH) |
| RECORD_DATE | DATE | NOT NULL | 기록 날짜 |
| TITLE | VARCHAR(200) | NOT NULL | 제목 |
| DESCRIPTION | TEXT | NULL | 상세 설명 |
| HEIGHT | DECIMAL(5,2) | NULL | 키 (cm) |
| WEIGHT | DECIMAL(5,2) | NULL | 체중 (kg) |
| TEMPERATURE | DECIMAL(4,2) | NULL | 체온 (°C) |
| SYMPTOMS | TEXT | NULL | 증상 |
| DIAGNOSIS | TEXT | NULL | 진단 |
| TREATMENT | TEXT | NULL | 치료 |
| MEDICATION | TEXT | NULL | 투약 |
| NOTES | TEXT | NULL | 특이사항 |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
| UPDATED_AT | DATETIME | NULL | 수정 시간 |
인덱스:
idx_health_record_user: 사용자별 검색idx_health_record_child: 자녀별 검색idx_health_record_date: 날짜별 정렬
설명: 건강 기록 관련 첨부파일
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 고유 식별자 |
| HEALTH_RECORD_ID | BIGINT | FK, NOT NULL | 건강 기록 ID |
| FILE_NAME | VARCHAR(255) | NOT NULL | 파일명 |
| FILE_PATH | VARCHAR(500) | NOT NULL | 파일 경로 |
| FILE_TYPE | VARCHAR(50) | NULL | 파일 유형 |
| FILE_SIZE | BIGINT | NULL | 파일 크기 (bytes) |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
설명: 정책 분류 카테고리
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 카테고리 고유 식별자 |
| NAME | VARCHAR(100) | UNIQUE, NOT NULL | 카테고리명 |
| DESCRIPTION | TEXT | NULL | 설명 |
| DISPLAY_ORDER | INT | DEFAULT 0 | 표시 순서 |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
| UPDATED_AT | DATETIME | NULL | 수정 시간 |
설명: 정부 및 지자체 정책 정보
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 정책 고유 식별자 |
| POLICY_ID | VARCHAR(50) | UNIQUE, NOT NULL | 정책 ID |
| CATEGORY_ID | BIGINT | FK, NULL | 카테고리 ID |
| TITLE | VARCHAR(500) | NOT NULL | 정책 제목 |
| DESCRIPTION | TEXT | NULL | 간략 설명 |
| CONTENT | TEXT | NULL | 상세 내용 |
| TARGET_AUDIENCE | VARCHAR(200) | NULL | 대상 |
| ELIGIBILITY | TEXT | NULL | 신청 자격 |
| BENEFITS | TEXT | NULL | 혜택 |
| APPLICATION_METHOD | TEXT | NULL | 신청 방법 |
| CONTACT_INFO | VARCHAR(200) | NULL | 문의처 |
| RELATED_LINK | VARCHAR(500) | NULL | 관련 링크 |
| START_DATE | DATE | NULL | 시작일 |
| END_DATE | DATE | NULL | 종료일 |
| STATUS | ENUM | NOT NULL | 상태 (ACTIVE, INACTIVE, EXPIRED) |
| VIEW_COUNT | INT | DEFAULT 0 | 조회수 |
| BOOKMARK_COUNT | INT | DEFAULT 0 | 북마크 수 |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
| UPDATED_AT | DATETIME | NULL | 수정 시간 |
인덱스:
idx_policy_category: 카테고리별 검색idx_policy_status: 상태별 검색idx_policy_dates: 기간별 검색
설명: 정책 관련 첨부 문서
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 고유 식별자 |
| POLICY_ID | BIGINT | FK, NOT NULL | 정책 ID |
| DOCUMENT_NAME | VARCHAR(255) | NOT NULL | 문서명 |
| DOCUMENT_PATH | VARCHAR(500) | NOT NULL | 문서 경로 |
| DOCUMENT_TYPE | VARCHAR(50) | NULL | 문서 유형 |
| FILE_SIZE | BIGINT | NULL | 파일 크기 (bytes) |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
설명: 사용자 알림 메시지
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 알림 고유 식별자 |
| USER_ID | BIGINT | FK, NOT NULL | 사용자 ID |
| TITLE | VARCHAR(200) | NOT NULL | 알림 제목 |
| CONTENT | TEXT | NOT NULL | 알림 내용 |
| TYPE | ENUM | NOT NULL | 알림 유형 (BOOKING, REVIEW, COMMENT, POLICY, SYSTEM) |
| RELATED_ID | VARCHAR(50) | NULL | 관련 엔티티 ID |
| RELATED_TYPE | VARCHAR(50) | NULL | 관련 엔티티 타입 |
| IS_READ | BOOLEAN | DEFAULT FALSE | 읽음 여부 |
| READ_AT | DATETIME | NULL | 읽은 시간 |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
인덱스:
idx_notification_user: 사용자별 검색idx_notification_read: 읽음 여부별 검색idx_notification_created: 생성일 정렬
설명: 알림 메시지 템플릿
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 템플릿 고유 식별자 |
| TEMPLATE_ID | VARCHAR(50) | UNIQUE, NOT NULL | 템플릿 ID |
| NAME | VARCHAR(100) | NOT NULL | 템플릿명 |
| TITLE | VARCHAR(200) | NOT NULL | 알림 제목 |
| CONTENT | TEXT | NOT NULL | 알림 내용 템플릿 |
| TYPE | ENUM | NOT NULL | 알림 유형 |
| VARIABLES | TEXT | NULL | 변수 목록 (JSON) |
| IS_ACTIVE | BOOLEAN | DEFAULT TRUE | 활성 여부 |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
| UPDATED_AT | DATETIME | NULL | 수정 시간 |
설명: 사용자별 알림 채널 선호도
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 고유 식별자 |
| USER_ID | BIGINT | FK, NOT NULL | 사용자 ID |
| NOTIFICATION_TYPE | ENUM | NOT NULL | 알림 유형 |
| EMAIL_ENABLED | BOOLEAN | DEFAULT FALSE | 이메일 알림 활성화 |
| PUSH_ENABLED | BOOLEAN | DEFAULT TRUE | 푸시 알림 활성화 |
| SMS_ENABLED | BOOLEAN | DEFAULT FALSE | SMS 알림 활성화 |
| IN_APP_ENABLED | BOOLEAN | DEFAULT TRUE | 인앱 알림 활성화 |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
| UPDATED_AT | DATETIME | NULL | 수정 시간 |
제약조건: UNIQUE(USER_ID, NOTIFICATION_TYPE)
설명: 사용자별 알림 전역 설정
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 고유 식별자 |
| USER_ID | BIGINT | FK, UNIQUE, NOT NULL | 사용자 ID |
| EMAIL_NOTIFICATIONS | BOOLEAN | DEFAULT TRUE | 이메일 알림 사용 |
| PUSH_NOTIFICATIONS | BOOLEAN | DEFAULT TRUE | 푸시 알림 사용 |
| SMS_NOTIFICATIONS | BOOLEAN | DEFAULT FALSE | SMS 알림 사용 |
| MARKETING_NOTIFICATIONS | BOOLEAN | DEFAULT FALSE | 마케팅 알림 사용 |
| NIGHT_MODE | BOOLEAN | DEFAULT FALSE | 야간 모드 |
| QUIET_TIME_START | TIME | NULL | 방해 금지 시작 시간 |
| QUIET_TIME_END | TIME | NULL | 방해 금지 종료 시간 |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
| UPDATED_AT | DATETIME | NULL | 수정 시간 |
설명: 사용자의 챗봇 대화 세션
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 세션 고유 식별자 |
| SESSION_ID | VARCHAR(50) | UNIQUE, NOT NULL | 세션 ID |
| USER_ID | BIGINT | FK, NULL | 사용자 ID (비로그인 가능) |
| TITLE | VARCHAR(200) | NULL | 대화 제목 |
| STATUS | ENUM | NOT NULL | 상태 (ACTIVE, CLOSED, ARCHIVED) |
| STARTED_AT | DATETIME | NOT NULL | 시작 시간 |
| ENDED_AT | DATETIME | NULL | 종료 시간 |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
| UPDATED_AT | DATETIME | NULL | 수정 시간 |
인덱스:
idx_chat_session_user: 사용자별 검색idx_chat_session_status: 상태별 검색
설명: 챗봇 대화 메시지
| 컬럼명 | 타입 | 제약조건 | 설명 |
|---|---|---|---|
| ID | BIGINT | PK, AUTO_INCREMENT | 메시지 고유 식별자 |
| SESSION_ID | BIGINT | FK, NOT NULL | 세션 ID |
| SENDER_TYPE | ENUM | NOT NULL | 발신자 유형 (USER, BOT) |
| MESSAGE | TEXT | NOT NULL | 사용자 메시지 |
| RESPONSE | TEXT | NULL | 봇 응답 |
| IS_HELPFUL | BOOLEAN | NULL | 도움 여부 피드백 |
| CREATED_AT | DATETIME | NOT NULL | 생성 시간 |
인덱스:
idx_chat_message_session: 세션별 검색idx_chat_message_created: 시간순 정렬
TBL_USER (1) ----< (N) TBL_CHILD
TBL_USER (1) ----< (N) TBL_POST
TBL_USER (1) ----< (N) TBL_COMMENT
TBL_USER (1) ----< (N) TBL_REVIEW
TBL_USER (1) ----< (N) TBL_CARE_FACILITY_BOOKING
TBL_USER (1) ----< (N) TBL_HOSPITAL_REVIEW
TBL_USER (1) ----< (N) TBL_HEALTH_RECORD
TBL_USER (1) ----< (N) TBL_NOTIFICATION
TBL_USER (1) ----o (1) TBL_NOTIFICATION_SETTINGS
TBL_CARE_FACILITY (1) ----< (N) TBL_REVIEW
TBL_CARE_FACILITY (1) ----< (N) TBL_CARE_FACILITY_BOOKING
TBL_USER (1) ----< (N) TBL_CARE_FACILITY_BOOKING >---- (1) TBL_CARE_FACILITY
TBL_CHILD (1) ----< (N) TBL_CARE_FACILITY_BOOKING
TBL_POST (1) ----< (N) TBL_COMMENT
TBL_POST (1) ----< (N) TBL_POST_LIKE
TBL_POST (1) ----< (N) TBL_BOOKMARK
TBL_POST (N) ----< >---- (N) TBL_TAG (through TBL_POST_TAG)
TBL_COMMENT (1) ----< (N) TBL_COMMENT (Self-referencing)
TBL_HOSPITAL (1) ----< (N) TBL_HOSPITAL_REVIEW
TBL_HOSPITAL (1) ----< (N) TBL_HOSPITAL_LIKE
TBL_HEALTH_RECORD (1) ----< (N) TBL_HEALTH_RECORD_ATTACHMENT
TBL_CHILD (1) ----< (N) TBL_HEALTH_RECORD
TBL_POLICY_CATEGORY (1) ----< (N) TBL_POLICY
TBL_POLICY (1) ----< (N) TBL_POLICY_DOCUMENT
TBL_CHAT_SESSION (1) ----< (N) TBL_CHAT_MESSAGE
TBL_USER (1) ----< (N) TBL_CHAT_SESSION
| 관계 | 유형 | 설명 |
|---|---|---|
| User - Child | 1:N | 한 사용자는 여러 자녀를 가질 수 있음 |
| User - Post | 1:N | 한 사용자는 여러 게시글 작성 가능 |
| Post - Comment | 1:N | 한 게시글에 여러 댓글 가능 |
| Comment - Comment | 1:N | 한 댓글에 여러 대댓글 가능 (Self-referencing) |
| Post - Tag | N:M | 게시글과 태그는 다대다 관계 |
| User - PostLike | 1:N | 한 사용자는 여러 게시글에 좋아요 가능 |
| Post - PostLike | 1:N | 한 게시글은 여러 좋아요 받을 수 있음 |
| CareFacility - Review | 1:N | 한 시설은 여러 리뷰 받을 수 있음 |
| Hospital - HospitalReview | 1:N | 한 병원은 여러 리뷰 받을 수 있음 |
| HealthRecord - Attachment | 1:N | 한 건강 기록은 여러 첨부파일 가능 |
| Policy - PolicyDocument | 1:N | 한 정책은 여러 문서를 가질 수 있음 |
| User - NotificationPreference | 1:N | 알림 유형별로 한 행씩 가짐 (UNIQUE: USER_ID + NOTIFICATION_TYPE) |
| ChatSession - ChatMessage | 1:N | 한 세션은 여러 메시지를 포함 |
-
검색 최적화
idx_user_email: 이메일 로그인 검색idx_care_facility_name: 시설명 검색idx_hospital_name: 병원명 검색idx_policy_title: 정책 제목 검색
-
정렬 최적화
idx_post_created_at: 게시글 최신순 정렬idx_care_facility_rating: 평점순 정렬idx_notification_created: 알림 시간순 정렬
-
필터링 최적화
idx_post_category: 카테고리별 필터링idx_post_status: 상태별 필터링idx_hospital_type: 병원 유형별 필터링
-
위치 기반 검색
idx_care_facility_location: 시설 위치 검색 (SPATIAL)idx_hospital_location: 병원 위치 검색 (SPATIAL)
-- 중복 방지
UNIQUE (USER_ID, NOTIFICATION_TYPE) -- 알림 설정 중복 방지
UNIQUE (POST_ID, USER_ID) -- 좋아요 중복 방지
UNIQUE (POST_ID, USER_ID) -- 북마크 중복 방지
UNIQUE (USER_ID, HOSPITAL_ID) -- 병원 좋아요 중복 방지-- CASCADE 삭제: 부모 엔티티 삭제 시 자식도 삭제
ON DELETE CASCADE:
- TBL_COMMENT (POST_ID references TBL_POST)
- TBL_POST_LIKE (POST_ID references TBL_POST)
- TBL_HEALTH_RECORD_ATTACHMENT (HEALTH_RECORD_ID references TBL_HEALTH_RECORD)
-- SET NULL: 부모 엔티티 삭제 시 NULL 설정
ON DELETE SET NULL:
- TBL_POST (AUTHOR_ID references TBL_USER)
- TBL_COMMENT (AUTHOR_ID references TBL_USER)-- 데이터 유효성 검사
CHECK (RATING >= 1 AND RATING <= 5) -- 평점 범위
CHECK (AVG_RATING >= 0.0 AND AVG_RATING <= 5.0) -- 평균 평점 범위
CHECK (END_DATE IS NULL OR END_DATE >= START_DATE) -- 종료일이 시작일보다 이후- 모든 외래 키에 대한 적절한 CASCADE/SET NULL 설정
- 고아 레코드 방지를 위한 제약조건
- NOT NULL 제약조건으로 필수 필드 보장
- CHECK 제약조건으로 유효한 값 범위 설정
- ENUM 타입으로 허용된 값만 저장
- 모든 테이블에 PRIMARY KEY 설정
- UNIQUE 제약조건으로 중복 방지
TBL_USER.DELETED_AT: 사용자 소프트 삭제- 실제 데이터는 보존하면서 논리적으로 삭제 처리
- 모든 테이블에
CREATED_AT필드 - 대부분의 테이블에
UPDATED_AT필드 - 생성/수정 시간 자동 추적
- 사용자 데이터는 USER_ID로 샤딩 가능
- 지역 기반 데이터는 위치 정보로 샤딩 가능
- 인덱스 최적화로 쿼리 성능 향상
- 파티셔닝 전략 적용 가능 (날짜 기반)
- 자주 조회되는 데이터 (시설 정보, 병원 정보, 정책 정보)
- 읽기 전용 복제본 활용
- 오래된 알림 데이터 아카이빙
- 완료된 채팅 세션 아카이빙
- Flyway/Liquibase 사용 권장
- 스키마 변경 이력 추적
- 롤백 스크립트 준비
- 인덱스 생성 (대량 데이터 적재 후)
- 외래 키 제약조건 설정
- 초기 데이터 적재 (카테고리, 템플릿 등)
- 성능 테스트 및 쿼리 최적화
- 백업 및 복구 절차 수립
- 모든 테이블은
TBL_접두사 사용 - 언더스코어(
_) 구분자 사용 - 대문자 사용
- 언더스코어(
_) 구분자 사용 - 대문자 사용
- ID 필드는
ID, 외래 키는[TABLE_NAME]_ID
- 문자열: VARCHAR (가변), TEXT (긴 텍스트)
- 숫자: BIGINT (ID), INT (카운트), DECIMAL (정확한 소수)
- 날짜/시간: DATE (날짜만), DATETIME (날짜+시간), TIME (시간만)
- 불린: BOOLEAN (TRUE/FALSE)
- 열거형: ENUM (고정된 값 목록)
문서 버전: 1.0 작성일: 2025-11-02 작성자: CareCode Development Team 데이터베이스: MariaDB 10.x 이상 문자셋: utf8mb4 (한글 및 이모지 지원)