스킨 테이블(Skin) :케릭터 외관 설정
컬럼 | 형태 | 키 | 조건 | 설명 |
id | int | Primary key | not null | 자동생성 |
name | VARCHAR(50) | not null | 스킨 이름 | |
description | text | not null | 스킨 설명 | |
imgURL | VARCHAR | |||
created_at | DateTime | not null | 생성 날짜 | |
characters | Character[] | 1:n관계 |
계정 테이블(Account)
컬럼 | 형태 | 키 | 조건 | 설명 |
id | int | Primary Key | not null | 자동 생성된ID |
username | VARCHAR(50) | not null | 사용자 이름 | |
VARCHAR(100) | Unique | not null | 이메일 주소 | |
password | VARCHAR(255) | not null | 암호화된 비밀번호 | |
created_at | DATETIME | default now | 계정 생성 날짜 | |
updatedAt | DATETIME | DateTime | not null | 수정시간 |
characters | Character[] | 1:N관계를 정의 |
캐릭터
컬럼 | 형태 | 키 | 조건 | 설명 |
id | int | Primary key | not null | 자동생성 |
name | varchar(50) | |||
level | int | default 1 | 캐릭터 레벨 | |
health | int | not null | ||
power | int | not null | ||
money | int | not null | ||
account | Foreign Key | not null | Account @relation(fields: [accountId], references: [id]) | |
account_id | ||||
skin | Foreign Key | 스킨테이블 참조 | ||
skin_id | ||||
created_at | DATETIME | not null | 캐릭터 생성 날짜 |
캐릭터 아이템 테이블(CharacterItem) :장착중인 아이템 목록
컬럼 | 형태 | 키 | 조건 | 설명 |
id | int | Primary key | not null | 자동생성 |
character_id | int | FK | not null | (FK): INT, Character.id를 참조 |
item_id | int | FK | not null | (FK): INT, Item.id를 참조 |
equipped_slot | ENUM('head', 'body', 'hand', 'foot') | not null | 장착된 부위 | |
changed_at | DATETIME | default now | 장착된 날짜 |
캐릭터 인벤토리 테이블(CharacterInventory) :캐릭터가 보유는 하고있으나 장착하고 있지 않은 아이템 정보
컬럼 | 형태 | 키 | 조건 | 설명 |
id | int | Primary Key | not null | 자동 생성된ID |
character_id | int | Foreign Key | not null | 캐릭터 테이블 참조 |
item_id | int | Foreign Key | not null | 아이템 테이블 참조 |
quantity | int | default 1 | 아이템 수량 | |
changed_at | DATETIME | default now | 추가된 날짜 |
아이템 테이블(Item) :모든 아이템 정보
컬럼 | 형태 | 키 | 조건 | 설명 |
id | int | Primary key | not null | 자동생성 |
name | VARCHAR(50) | not null | ('head', 'chest', 'legs', 'weapon', 'shield', 'accessory'),장착 부위 | |
description | text | |||
price | int | not null | ||
slot | ENUM | not null | ||
health | int | not null | ||
power | int | not null | ||
created_at | DATETIME | default now | 생성 날짜 |
DB ERD 관계선 : https://eyecandyzero.tistory.com/246
-
|: 1개 / 실선은(dash) ‘1'을 나타낸다.
-
∈: 여러개 / 까마귀 발(crow’s foot or Many)은 ‘다수' 혹은 '그 이상'을 나타낸다.
-
○: 0개 / 고리(ring or Optional)은 ‘0'을 나타낸다.
- Type1(실선과 실선): 정확히 1 (하나의 A는 하나의 B로 이어져 있다.)
- Type2(까마귀발): 여러개 (하나의 A는 여러개의 B로 구성되어 있다.)
- Type3(실선과 까마귀발): 1개 이상 (하나의 A는 하나 이상의 B로 구성되어 있다.)
- Type4(고리와 실선): 0 혹은 1 (하나의 A는 하나 이하의 B로 구성되어 있다.)
- Type5(고리와 까마귀발): 0개 이상 (하나의 A는 0또는 하나 이상의 B로 구성되 있다.)
슈퍼 키(Super Key): 유일성을 만족하는 키. 예를 들면, {학번 + 이름}, {주민등록번호 + 학번}
복합 키(Composite Key): 2개 이상의 속성(attribute)를 사용한 키.
후보 키(Candidate key): 유일성과 최소성을 만족하는 키. 기본키가 될 수 있는 후보이기 때문에 후보키라고 불린다. 예를 들면, 주민등록번호, 학번 등
기본 키(Primary key): 후보 키에서 선택된 키. NULL값이 들어갈 수 없으며, 기본키로 선택된 속성(Attribute)은 동일한 값이 들어갈 수가 없다.
대체 키(Surrogate key): 후보 키 중에 기본 키로 선택되지 않은 키.
외래 키(Foreign Key): 어떤 테이블(Relation) 간의 기본 키(Primary key)를 참조하는 속성이다. 테이블(Relation)들 간의 관계를 나타내기 위해서 사용된다.
외래키 컬럼을 2개 만드는 이유 : 무결성원칙을 지키기 위해서 인듯.
사용하고 있는 캐릭터가 있으면 스킨 등을 삭제 하지 못하도록 막음
오류발생
사용중이던 스킨 삭제 시 캐릭터의 스킨을 기본값으로 바꾸기
onDelete:SetDefault 로 적기
참고 : https://lemonlog.tistory.com/91?category=1226142
// Error validating: This line is not a valid field or attribute definition.
model Skin {
skinId Int @id @default(autoincrement()) @map("skinId")
name String @unique @map("name")
description String? @map("description")
imgURL String? @map("imgURL")
created_at DateTime @updatedAt @map("created_at")
character Character[]
@@map("Skin")
}
model Character {
characterId Int @id @default(autoincrement()) @map("characterId")
skinId Int @default(1) @map("skinId")
name String @unique @map("name")
leval Int @map("leval")
health Int @unique @map("health")
power Int @map("power")
money Int @map("money")
createdAt DateTime @default(now()) @map("createdAt")
// 이 줄에서 발생
// onDelete: SET DEFAULT말고 onDelete:SetDefault 로 적기
skin Skin @relation(fields: [skinId], references: [skinId], onDelete: SET DEFAULT)
@@map("Character")
}
참고 출처
DB ERD 관계선 : https://eyecandyzero.tistory.com/246
키 종류: https://inpa.tistory.com/entry/DB-📚-키KEY-종류-🕵️-정리 [Inpa Dev 👨💻:티스토리]
prisma 문서 : https://www.prisma.io/docs/orm/prisma-schema/data-model/relations/referential-actions#mysql
'내일배움 과제 > CH3 아이템 박스 시뮬레이터' 카테고리의 다른 글
참고 자료 (0) | 2024.11.28 |
---|---|
3.7부터 Sign up/Log in (0) | 2024.11.27 |