요구사항
게임에서 한 명의 User에 3명의 서로 다른 User를 매칭하고 싶음
초기설계 및 문제 발생 이유
초기설계

Battle_Target 테이블에 3명의 상대방 id를 기록함
>> 이와 같이 설계하면 Table Join할 때 문제가 골치 아프다.
Join의 결과를 생각해보면
| id | user_id | enemy_id1 | enemy1의 User 테이블 column | enemy_id2 | ...?
enemy_id에 따른 enemy 정보를 가져오려면 각각 column을 select해서 join을 해야 한다.
복잡한 과정을 통해 원하는 정보를 얻어야 하는 것을 보아 Table이 깔끔하지 않다는 생각이 든다.
문제 발생 이유
enemy_id1, enemy_id2, enemy_id3는 attribute(속성)이 아니라 value(값)을 칭한다. (학교 수업 인용)
Column을 attribute가 아닌 value로 지정하면 데이터의 무결성을 해칠 수 있다.
데이터 무결성이란?
데이터가 전송, 저장되고 처리되는 모든 과정에서 변경되거나 손상되지 않고 완전성, 정확성, 일관성을 유지함을 보장하는 특성. DB 시스템에서는 무결성 제약 조건을 부여하여 데이터에 대한 결손과 부정합이 없음을 보증한다.
(TTA 정보통신용어사전)
문제해결

enemy_id(숫자)가 attribute의 속성을 가지기 위해서는 enemy_id 라고 column을 지정하고
Battle_Target 테이블에 user_id의 개수가 3개가 저장되도록 제약 조건을 걸어야 한다.
Column이 value가 되면 무결성을 해치는 이유
내 생각에 enemy_id1, enemy_id2, enemy_id3는 집합 enemy_id에 속하기 때문에 column으로 사용하면 의미가 겹쳐서 무결성을 해칠 수 있다고 이해했다. 따라서 enemy_id(숫자)를 enemy_id로 합쳐서 column이 집합의 원소가 아닌 집합의 의미를 가지도록 해야 한다.
(집합 개념은 블로그를 참고하여 떠올렸다)
'개발 > 기타' 카테고리의 다른 글
사이드 프로젝트:: 자동 메일링 서비스 (0) | 2025.03.22 |
---|---|
기타:: 230116 일기2 - 자동 채점기 리팩토링(Python) (0) | 2023.01.16 |
Flutter:: 참고 문서 (1) | 2022.09.08 |
Flutter:: 갤러리에서 이미지 가져오기 (0) | 2022.08.10 |
Windows :: 윈도우에 등록된 와이파이 비번 알아내기 (0) | 2022.05.05 |