-- MySQL Workbench Forward Engineering

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

-- -----------------------------------------------------
-- Schema eod_authentication
-- -----------------------------------------------------
-- 인증 데이터베이스

-- -----------------------------------------------------
-- Schema eod_authentication
--
-- 인증 데이터베이스
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `eod_authentication` DEFAULT CHARACTER SET utf8 COLLATE utf8_unicode_ci ;
-- -----------------------------------------------------
-- Schema eod_game
-- -----------------------------------------------------
-- 게임 데이터베이스
-- -----------------------------------------------------
-- Schema eod_log
-- -----------------------------------------------------
-- 로그 데이터베이스
-- -----------------------------------------------------
-- Schema eod_ranking
-- -----------------------------------------------------
-- 랭킹 데이터베이스
-- -----------------------------------------------------
-- Schema eod_community
-- -----------------------------------------------------
-- 커뮤니티 데이터베이스
-- -----------------------------------------------------
-- Schema eod_tool
-- -----------------------------------------------------
-- 서비스 관리도구용 데이터베이스
-- -----------------------------------------------------
-- Schema eod_configuration
-- -----------------------------------------------------
-- 서비스 설정 데이터베이스
-- -----------------------------------------------------
-- Schema eod_global
-- -----------------------------------------------------
-- 전역 서비스 관리 데이터베이스
USE `eod_authentication` ;

-- -----------------------------------------------------
-- Table `eod_authentication`.`table_account_user`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `eod_authentication`.`table_account_user` (
  `user_id` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT '사용자 계정마다 부여하는 고유 번호\n\n- 고유 번호는 한 번 부여하면 변하지 않는다.\n\n- 직접 클라이언트에게 노출하지 않는다. 클라이언트는 오직 로그인 한 이후에 authntication_ticket만 받아갈 수 있을 뿐이다. \n\n- 사용자 계정 고유 번호의 첫 6비트는 그 캐릭터가 소속될 게임 DB의 번호이다. \n: 이를 통해, 해당 플레이어가 어느 DB에 소속되는지 알 수 있다.',
  `serial_code` VARCHAR(24) NOT NULL DEFAULT '' COMMENT '계정마다 부여하는 시리얼 코드\n\n- 각 글자마다 [A-Z], [0-9]인 16글자로 구성한다.\n: 영문자는 대문자만 사용한다.\n\n- 각 계정들은 반드시 하나의 시리얼 코드를 보유해야 한다.',
  `authentication_number` BIGINT(20) UNSIGNED NOT NULL DEFAULT '0' COMMENT '발급한 인증 번호\n\n- 인증 번호는 64비트의 부호 없는 정수형으로 만든다.\n\n- 상위 32비트는 인증 번호를 발급할 시점의 서버 시간(단, UTC 시간임.)에 대한 상위 32비트를 나타낸다.\n: 접속한 연-월-일(YYYY-MM-DD)과 같다.\n\n- 하위 32비트는 ',
  `state` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '플레이어의 현재 상태\n\n- enum ePlayerState의 값과 같다.\n\n- 사용자에게 노출하지는 않으며, 플레이어 관리 측면에서만 사용한다.\n',
  `sanctions_end_datetime` DATETIME NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '플레이어 데이터의 처벌(계정 접근 정지)이 종료될 일시\n: 플레이어에 대한 징계 용도로 사용한다. \n\n - 이 값이 DateTime.MinValue(1000-01-01)인 경우, 접근 정지가 없다는 의미이다.\n\n - 이 값이 DateTime.MaxValue(9999-12-31)인 경우, 무제한이라는 의미이다.',
  `nickname` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '사용자 계정 별명\n\n- 잠정적으로 보통 별명은 보통 최대 16글자까지 할당한다고 가정한다.\n\n- 그래서, 이름에 16 × 3 = 48 바이트가 필요하다.\n\n- 삭제한 계정의 경우, 다른 사용자가 이름을 사용할 수 있도록 하기 위해, 삭제한 계정의 이름에 추가적인 문자열을 넣어서 바꿔야 한다.\n: 이 때, 바꾸는 이름도 전체 DB에서 유일해야 하므로, 대개 user_id를 넣어서 바꾸게 된다.\n  user_id는 64비트 부호 없는 정수이기 때문에 20자리까지 나오는 수이다. 그러므로 20바이트는 추가로 필요하다. \n\n-  거기에 추가적으로 더 붙어야 하는 여유 공간을 생각하면 총 48 + 20 + 28 = 96바이트가 적당한 것 같다.\n: 이 정도면 별명 길이의 한계가 20글자로 더 길어져야 한다고 해도 여유 공간상 크게 문제 없다고 본다.',
  `join_datetime` DATETIME NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '계정을 생성한 일시 ',
  `last_login_datetime` DATETIME NOT NULL DEFAULT '1000-01-01 00:00:00' COMMENT '마지막으로 로그인한 일시 ',
  `application_version` INT(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '접속한 애플리케이션 버전',
  `game_data_version` INT(11) UNSIGNED NOT NULL DEFAULT '0' COMMENT '접속한 게임 데이터 버전',
  `platform_type` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '로그인 한 사용자의 플랫폼 타입\n\n- UnityEngine.RuntimePlatform의 값을 그대로 사용한다.\n\n- UnityEngine.Application.platform의 값을 그냥 보내면 된다.',
  `device_model` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '로그인한 사용자의 기기의 제조 구분 타입 \n\n- 제조자가 정하고 있는 기기의 분류 명칭을 일컫는다.\n\n- 사용자의 기기 분포 같은 데 써먹으려고...\n\n- 사용자가 기기를 바꿔서 로그인했다면, 이 값도 바뀐다.',
  `device_os` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '로그인한 사용자의 운영체제 버전 ',
  `update_datetime` DATETIME NOT NULL DEFAULT '1000-01-01 00:00:00',
  PRIMARY KEY (`user_id`),
  UNIQUE INDEX `authentication_number_UNIQUE` (`authentication_number` ASC),
  UNIQUE INDEX `nickname_UNIQUE` (`nickname` ASC),
  UNIQUE INDEX `serial_code_UNIQUE` (`serial_code` ASC))
ENGINE = ndbcluster
COMMENT = '사용자 계정 정보';


-- -----------------------------------------------------
-- Table `eod_authentication`.`table_account_relationship`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `eod_authentication`.`table_account_relationship` (
  `account` VARCHAR(128) NOT NULL COMMENT '사용자 ID와 연계한 계정의 이름\n\n- 계정은 직접 관리하지 않으며, 다른 서비스 업체(Google, Apple, Facebook 등)의 계정 정보를 연동하는 방식으로 이루어진다.\n\n- 타 서비스 업체의 로그인 과정을 거쳐 발급한 고유 키 값을 계정으로 사용한다.\n\n- 이를 제외하고, 각 사용자 ID당 무조건 하나씩 발급해야 하는 시리얼 코드가 있다.\n: 이 시리얼 코드 역시 계정명의 하나로써 취급한다.',
  `user_id` BIGINT(20) UNSIGNED NOT NULL DEFAULT '0' COMMENT '이 계정과 연동되는 사용자 ID\n\n- 하나의 사용자 ID에 여러 계정이 연동될 수 있다.',
  `relation_type` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '연관 타입\n\n- 어떤 방식의 계정으로 연동된 것인지를 나타낸다.\n\n- 값은 eAccountRelation과 같다.\n',
  `related` TINYINT(1) NOT NULL DEFAULT '0' COMMENT '연동 상태\n\n- 계정 연동이 된 상태인지를 나타낸다.\n: true는 계정 연동이 된 상태이고, false는 연동되지 않은 상태임을 나타낸다.\n\n- 특정 계정에 대해, 연동을 했다가 취소하면 이 값은 false가 된다.',
  `generate_datetime` DATETIME NOT NULL DEFAULT '1000-01-01 00:00:00',
  PRIMARY KEY (`account`),
  INDEX `user_id_relation_type_idx` (`user_id` ASC, `relation_type` ASC))
ENGINE = ndbcluster
COMMENT = '외부 서비스와 사용자 계정 간 연동 정보';


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
