<aside> 📌

Mysql DB 접속 방법

mysql -u root -p
password: Dang1216@@
SHOW DATABASES; 
USE library_network;

</aside>

최종 스키마

1. users

CREATE TABLE users (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    login_id VARCHAR(50) NOT NULL UNIQUE,        -- 로그인 아이디
    password VARCHAR(255) NOT NULL,              -- 로그인 비밀번호 
    username VARCHAR(50) NOT NULL,               -- 화면에 보여줄 이름(닉네임)
    role ENUM('USER', 'ADMIN') NOT NULL DEFAULT 'USER',
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

2. seats

CREATE TABLE seats (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    floor INT NOT NULL,
    room ENUM('A', 'B') NULL,     -- 일부 층은 A/B 구분 없음
    seat_number VARCHAR(20) NOT NULL,
    UNIQUE (floor, room, seat_number)
);

※ room이 NULL일 수 있으므로

UNIQUE (floor, room, seat_number) 는 "NULL은 서로 다른 것으로 취급"됨 → 문제 없음.


3. checkins

CREATE TABLE checkins (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    seat_id BIGINT NOT NULL,
    checkin_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    checkout_time TIMESTAMP NULL,
    status ENUM('IN_USE', 'AWAY') DEFAULT 'IN_USE', 
    away_started_at TIMESTAMP NULL,  

    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (seat_id) REFERENCES seats(id)
);

⚠︎ checkins에는 room이 따로 필요 없음 → seat_id만으로 확인 가능.


4. chat_messages

채팅은 구역별 채팅이므로 floor만 있고 room이 NULL이면 → 층 전체 채팅으로 해석함.

CREATE TABLE chat_messages (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    floor INT NOT NULL,
    room ENUM('A', 'B') NULL,   -- 해당 층이 A/B 구분 없으면 NULL 채팅방
    user_id BIGINT NULL,
    message TEXT NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    role VARCHAR(20) NOT NULL DEFAULT 'USER',
    nickname VARCHAR(50) NOT NULL,
    
    FOREIGN KEY (user_id) REFERENCES users(id)
);

5. sensor_data