문서 수정
|
회원 정보
|
|||
|
Table
|
user
|
||
|
컬럼명
|
데이터 타입
|
제약 조건
|
설명
|
|
id
|
VARCHAR(20)
|
NOT NULL / UQ
|
로그인 ID
|
|
password
|
VARCHAR(64)
|
NOT NULL
|
비밀번호
|
|
nickname
|
VARCHAR(50)
|
NOT NULL
|
표시용 닉네임
|
|
created_at
|
INT
|
NOT NULL
|
가입일시
|
|
pk_id
|
INT
|
PRIMARY KEY / NOT NULL / AI
|
식별용 ID
|
|
|
|
|
|
|
채팅방 정보
|
|||
|
Table
|
chatroom
|
||
|
컬럼명
|
데이터 타입
|
제약 조건
|
설명
|
|
room_id
|
INT
|
PRIMARY KEY / AUTO_INCREMENT
|
채팅방 고유번호
|
|
room_name
|
VARCHAR(50)
|
NOT NULL
|
채팅방 이름
|
|
room_type
|
ENUM('open','group')
|
NOT NULL
|
채팅방 유형(오픈/그룹)
|
|
creator_id
|
INT
|
FOREIGN KEY REFERENCES user(pk_id)
|
생성자 ID
|
|
created_at
|
INT
|
NOT NULL
|
생성일시
|
|
|
|
|
|
|
방 참가자
|
|||
|
Table
|
chatroom_user
|
||
|
컬럼명
|
데이터 타입
|
제약 조건
|
설명
|
|
room_id
|
INT
|
NOT NULL, FK REFERENCES chatroom(room_id)
|
참여한 채팅방 ID
|
|
user_id
|
INT
|
NOT NULL, FK REFERENCES user(pk_id)
|
참여한 사용자 ID
|
|
joined_at
|
INT
|
NOT NULL
|
입장 시각
|
|
|
|
|
|
|
채팅 메시지
|
|||
|
Table
|
chat_message
|
||
|
컬럼명
|
데이터 타입
|
제약 조건
|
설명
|
|
message_id
|
INT
|
PRIMARY KEY / AUTO_INCREMENT
|
메시지 고유번호
|
|
room_id
|
INT
|
NOT NULL, FK REFERENCES chatroom(room_id)
|
방 ID
|
|
sender_id
|
INT
|
NOT NULL, FK REFERENCES user(pk_id)
|
보낸 사용자 ID
|
|
message
|
TEXT
|
NOT NULL
|
메시지 내용
|
|
send_at
|
INT
|
NOT NULL
|
전송 시각
|
크게 변경된 것은
1. id열
2. 추가된 pk_id
3. creat_at을 비롯한 여러가지 시각 열
첫번째
기존 users 테이블 중 primary key 였던 id의 제약조건을 해제하고, pk_id를 추가하여 primary key로 지정하였음
이유는 요구사항 중 아이디 변경 요구가 있는데, 데이터 베이스에서 primary key를 변경하는 것은 전체적인 관점에서 굉장히 위험한 일이라고 한다
구체적으로 primary key인 id를 A로 다른 테이블에서 참조하고 있는 상황에서 A가 B로 바뀌는 상황에 놓이게 된다면 값은 바뀌었지만 참조는 계속 A를 하게되는 일명 "고아 데이터(Orphan Data)"가 발생하게 된다는 것
결국 데이터가 정확하고 완전하며 일관된 상태를 유지할 수 없는 상태에 놓이게 되는 위험이 발생하고, 이를 데이터 무결성이라고 부른다고 함
따라서 오로지 식별, 참조만을 위한 pk_id를 id를 대신하여 primary key로 생성함으로써 데이터 무결성을 확보하도록 하였음
두번째
기존 xxxx_at의 데이터 타입은 DATETIME, 제약 조건은 DEFAULT CURRENT_TIMESTAMP
이는 데이터를 입력하면 그 시각을 자동으로 현재 시간을 입력해주는 역할을 하는데
문제는 서버에서 쿼리문을 작성하여 저장을 시도했을 때 문제가 발생
DATETIME에서 자동으로 생성해주는 현재시간은 데이터베이스에 저장되는 그 순간이고,
실제 서버에서 함수가 작동되는 순간과는 다를 수 있다
이는 매우 짧은 순간이지만 프로그램과 데이터베이스의 규모가 커질수록 굉장히 큰 문제가 될 수 있다
따라서 서버에서 (int)time(NULL)를 통해 변수에 저장하고, 데이터베이스에 옮겨 기록하면 확실한 시간을 기록할 수 있는 것이다
'LMS 7 > 개발일지' 카테고리의 다른 글
| 25.07.18 개발일지 / 채팅 프로그램 5팀 (3) | 2025.07.29 |
|---|---|
| 25.07.17 개발일지 / 채팅 프로그램 5팀 (0) | 2025.07.29 |
| 2025.07.15 개발일지 [채팅 프로그램 5팀 / 테이블 명세서 / ERD] (0) | 2025.07.29 |
| 25.07.14 개발일지 / 멀티스레드를 통한 채팅프로그램 구상 (2) | 2025.07.29 |
| 25.07.12 학습일지 / mySQL, C (0) | 2025.07.29 |