Published on

24.02.01 이찬우 회고

Authors
  • avatar
    Name
    이찬우
    Twitter

아직 기획서가 나오지 않은 상태이지만, 아무것도 하지 않고 기다릴 수는 없으니 지금까지 회의에서 나온 아이디어를 바탕으로 DB설계를 해보도록 하였습니다.


CREATE TABLE TB_USER(
		USER_ID VARCHAR(30) PRIMARY KEY,
    PASSWORD VARCHAR(1000) NOT NULL,
    EMAIL VARCHAR(50) UNIQUE NOT NULL,
    SALT VARCHAR(500) NOT NULL,
		NICKNAME VARCHAR(20) NOT NULL,
    REFRESH_TOKEN VARCHAR(1000),
		CREATE_DATE DATETIME DEFAULT CURRENT_TIMESTAMP,
		LASTEST_LOGIN DATETIME DEFAULT CURRENT_TIMESTAMP
);

유저 테이블(TB_USER)

유저 정보를 저장하는 테이블입니다.

  • USER_ID: 유저의 아이디 칼럼입니다. primary key를 주었습니다.
  • PASSWORD: 유저의 비밀번호를 저장하는 칼럼으로, NOT NULL 제약조건이 걸려 있습니다.
  • EMAIL: 유저의 이메일 주소를 저장하는 칼럼으로, UNIQUE 제약조건이 걸려 있습니다. NOT NULL 제약조건도 적용되어 있습니다. 비밀번호 변경이나 아이디 찾기에 사용할 수 있도록 회원가입 시 입력받도록 만들었지만, 실제로 비밀번호 변경이나 아이디 찾기를 구현할 시간적 여유가 있을지 알 수 없습니다.
  • SALT: 비밀번호 해싱 시 사용되는 무작위 문자열을 저장하는 칼럼으로, NOT NULL 제약조건을 걸었습니다.
  • NICKNAME: 유저의 닉네임을 저장하는 칼럼으로, NOT NULL 제약조건을 걸었습니다.
  • REFRESH_TOKEN: 유저의 리프레시 토큰을 저장하는 칼럼입니다. VARCHAR(1000)으로 길이제한에 걸리지 않을지 걱정이 됩니다.
  • CREATE_DATE: 유저 계정 생성일을 저장하는 칼럼으로, 기본값으로 현재 시간을 설정하였습니다.
  • LATEST_LOGIN: 유저의 최근 로그인 시간을 저장하는 칼럼으로, 기본값으로 현재 시간이 설정되어 있습니다. 리프레시토큰을 저장할 때 같이 업데이트 되도록 설정하면 좋을 것 같습니다.

CREATE TABLE TB_ATTENDANCE(
	USER_ID VARCHAR(30) NOT NULL,
	ATT_DATE DATETIME DEFAULT CURRENT_TIMESTAMP,
	CONSTRAINT FK_ATTENDANCE_USER
		FOREIGN KEY (USER_ID)
        REFERENCES TB_USER(USER_ID)
				ON DELETE CASCADE
);

출석 테이블 (TB_ATTENDANCE)

유저의 출석 정보를 저장하는 테이블입니다.

  • USER_ID: 출석 정보와 연결된 유저의 아이디 칼럼으로, NOT NULL 제약조건이 걸려 있습니다.
  • ATT_DATE: 출석 일자를 저장하는 칼럼으로, 기본값으로 현재 시간이 설정되어 있습니다.
  • FOREIGN KEY (USER_ID): TB_USER 테이블의 USER_ID와 외래키 관계를 형성하였습니다.
  • ON DELETE CASCADE: 유저가 삭제되면 해당 유저의 모든 ATTENDANCE 데이터도 함께 삭제되도록 설정하였습니다.

CREATE TABLE TB_FRIEND_REQUEST(
	FRIEND_REQUEST_ID INT PRIMARY KEY AUTO_INCREMENT,
    FROM_USER VARCHAR(30) NOT NULL,
    TO_USER VARCHAR(30) NOT NULL,
    IS_FRIEND BOOL NOT NULL DEFAULT FALSE,
    CREATE_DATE DATETIME DEFAULT CURRENT_TIMESTAMP,
    COMPLY_DATE DATETIME NULL,

    CONSTRAINT FK_FRIEND_FROM_USER
      FOREIGN KEY (FROM_USER)
        REFERENCES TB_USER(USER_ID)
        ON DELETE CASCADE,
    CONSTRAINT FK_FRIEND_TO_USER
			FOREIGN KEY (TO_USER)
        REFERENCES TB_USER(USER_ID)
        ON DELETE CASCADE
);

TB_FRIEND_REQUEST 테이블

친구 신청 및 친구관계를 보여주는 테이블입니다.

  • FRIEND_REQUEST_ID: 친구 요청을 식별하는 고유한 번호로, 자동으로 증가합니다.
  • FROM_USER: 친구 요청을 보내는 사용자의 아이디입니다.
  • TO_USER: 친구 요청을 받는 사용자의 아이디입니다.
  • IS_FRIEND: 친구 요청의 수락 여부를 나타내는 불린 값으로, 기본값은 거짓(FALSE)입니다.
  • CREATE_DATE: 친구 요청이 생성된 일시를 저장하는 칼럼으로, 기본값으로 현재 시간이 설정되어 있습니다.
  • COMPLY_DATE: 친구 요청이 수락된 일시를 저장하는 칼럼으로, 수락되지 않았으면 NULL입니다.
  • FOREIGN KEY (FROM_USER): TB_USER 테이블의 USER_ID와 외래키 관계를 형성하고 있습니다. REFERENCES TB_USER(USER_ID ON DELETE CASCADE: FROM_USER가 삭제되면 해당 사용자와 관련된 친구 요청도 함께 삭제됩니다.
  • FOREIGN KEY (TO_USER): TB_USER 테이블의 USER_ID와 외래키 관계를 형성하고 있습니다. REFERENCES TB_USER(USER_ID) ON DELETE CASCADE: TO_USER가 삭제되면 해당 사용자와 관련된 친구 요청도 함께 삭제됩니다.

CREATE TABLE TB_ITEM(
	ITEM_ID INT PRIMARY KEY AUTO_INCREMENT,
  ITEM_NAME VARCHAR(20),
  ITEM_TYPE VARCHAR(20),
  ITEM_DESCRIPTION VARCHAR(200)
);

상품 테이블(TB_ITEM)

상품 정보를 저장하는 테이블입니다.

이 테이블은 주로 상품 관리에 사용되며, 각 상품은 고유한 ITEM_ID를 가지고 있습니다.

  • ITEM_ID: 상품을 식별하는 고유한 번호로, 자동으로 증가합니다.
  • ITEM_NAME: 상품의 이름을 저장하는 칼럼입니다.
  • ITEM_TYPE: 상품의 유형을 저장하는 칼럼입니다.
  • ITEM_DESCRIPTION: 상품에 대한 설명을 저장하는 칼럼입니다.

CREATE TABLE TB_INVENTORY(
		INVENTORY_ID INT PRIMARY KEY AUTO_INCREMENT,
    USER_ID VARCHAR(30) NOT NULL,
    ITEM_ID INT NOT NULL,
    CONSTRAINT FK_INVENTORY_USER
		FOREIGN KEY (USER_ID)
        REFERENCES TB_USER(USER_ID)
        ON DELETE CASCADE,
		CONSTRAINT FK_INVENTORY_ITEM
			FOREIGN KEY (ITEM_ID)
        REFERENCES TB_ITEM(ITEM_ID)
        ON DELETE CASCADE
);

인벤토리 테이블(TB_INVENTORY)

사용자의 인벤토리 정보를 저장하는 테이블입니다.

이 테이블은 사용자가 보유한 상품들을 추적하는 데 사용됩니다.

  • INVENTORY_ID: 인벤토리를 식별하는 고유한 번호로, 자동으로 증가합니다.
  • USER_ID: 해당 인벤토리에 속한 사용자의 아이디입니다. 외래키 제약조건이 걸려 있으며, 사용자가 삭제되면 인벤토리 데이터도 함께 삭제됩니다.
  • ITEM_ID: 해당 인벤토리에 속한 상품의 식별 번호입니다. 외래키 제약조건이 걸려 있으며, 상품이 삭제되면 인벤토리 데이터도 함께 삭제됩니다.

CREATE TABLE TB_SHOP(
	SHOP_ID INT PRIMARY KEY AUTO_INCREMENT,
    SHOP_ITEM_ID INT NOT NULL,
    SHOP_ITEM_PRICE INT NOT NULL,
    SALES_START_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    SALES_END_DATE DATETIME NOT NULL,

    CONSTRAINT FK_SHOP_ITEM
			FOREIGN KEY (SHOP_ITEM_ID)
        REFERENCES TB_ITEM(ITEM_ID)
        ON DELETE CASCADE
);

상점 테이블(TB_SHOP)에 대한 설명

상점에서 판매되는 상품 정보를 저장하는 테이블입니다.

  • SHOP_ID: 상점 항목을 식별하는 고유한 번호로, 자동으로 증가합니다.
  • SHOP_ITEM_ID: 상점에 등록된 상품의 식별 번호로, 외래키 제약조건이 걸려 있습니다. REFERENCES TB_ITEM(ITEM_ID): 외래키가 참조하는 테이블과 칼럼을 지정합니다. ON DELETE CASCADE: 상품이 삭제되면 해당 상품과 관련된 상점 데이터도 함께 삭제됩니다.
  • SHOP_ITEM_PRICE: 상품의 가격을 나타내는 칼럼입니다.
  • SALES_START_DATE: 상품의 판매 시작일시를 나타내는 칼럼으로, 기본값으로 현재 시간이 설정되어 있습니다.
  • SALES_END_DATE: 상품의 판매 종료일시를 나타내는 칼럼입니다.

RESULT_ID INT PRIMARY KEY AUTO_INCREMENT,
    USER_ID VARCHAR(30) NOT NULL,
    ROLE_ID INT NOT NULL,
    IS_WIN TINYINT NOT NULL DEFAULT 0,
    PLAY_DATE DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    CONSTRAINT FK_RESULT_USER
		FOREIGN KEY (USER_ID)
        REFERENCES TB_USER(USER_ID),
        ON DELETE CASCADE
	CONSTRAINT FK_RESULT_ROLE
		FOREIGN KEY (ROLE_ID)
        REFERENCES TB_ROLE(ROLE_ID)
        ON DELETE CASCADE
);

결과 테이블(TB_RESULT)에 대한 설명

사용자가 참여한 게임의 결과를 저장하는 테이블입니다.

  • RESULT_ID: 결과 항목을 식별하는 고유한 번호로, 자동으로 증가합니다.
  • USER_ID: 결과에 참여한 사용자의 아이디입니다. 외래키 제약조건이 걸려 있어서, 사용자가 삭제되면 결과 데이터도 함께 삭제됩니다.
  • ROLE_ID: 결과에 할당된 역할의 식별 번호입니다. 외래키 제약조건이 걸려 있어서, 역할이 삭제되면 결과 데이터도 함께 삭제됩니다.
  • IS_WIN: 결과가 승리인지 여부를 나타내는 작은 정수로, 기본값은 0입니다. (0: 패배, 1: 승리)
  • PLAY_DATE: 결과가 기록된 날짜 및 시간입니다. 기본값으로 현재 시간이 설정되어 있습니다.

CREATE TABLE TB_ROLE(
	ROLE_ID INT PRIMARY KEY AUTO_INCREMENT,
    ROLE_NAME VARCHAR(10) NOT NULL UNIQUE
);

역할 테이블(TB_ROLE)에 대한 설명

사용자 역할 정보를 저장하는 테이블입니다.

  • ROLE_ID: 역할을 식별하는 고유한 번호로, 자동으로 증가합니다.
  • ROLE_NAME: 역할의 이름을 저장하는 칼럼으로, NOT NULL 및 UNIQUE 제약조건이 걸려 있습니다.

일단은 이런 식으로 큰 틀만 만들었습니다. 앞으로 나오는 기획에 따라서 수정하여 사용하면 될 것 같습니다.