DB 아이템 테이블 구조

2009. 4. 1. 15:54Java

DB 아이템 테이블 구조 어떤방식을 사용하시나요?^^ 올려짐: 2006-11-14 21:46
인용과 함께 답변 이 게시물을 del.icio.us에 추가

gal_yong 씀:
한 캐릭터가 가지는 아이템 갯수는 가변적일 텐데요 

보통 아이템 테이블을 어떻게 구성하시는지 궁금해서 문의 드립니다^^ 

제가 생각한 방법은 char배열 타입을 사용해서 한 캐릭터의 아이템정보를 

하나의 필드에 모두 넣는 형태를 사용하시는지 

( 이때는, 한번의 update문으로 저장가능하고 아이템 갯수만큼의 정보만 저장하면 되겠죠, 
단점은 캐릭터가 가진 아이템 정보를 자세히 보려면 
바이너리정보를 볼 수 있도록 변환하는 툴이 있어야할거구요~ ) 

그보다 괜찮은 방식이 있다면 알고 싶어서요 ^ㅡ^;


되도록 그렇게 쓰시지는 말기를 권해 드립니다. 
사실 최대한 정규화한 방법을 추천하지만, 일부 개발자분들께서는 이런 저런 이유료 싫어하시더군요. 
비정규화는 일단 정규화를 한 다음에 해야 하는데  

== 

일단 char 배열로 한 캐릭터의 아이템 정보를 모두 저장할 때 발생할 수 있는 문제는. 
(위의 말을 ItemCode:ItemCnt:ItemProperty1:ItemProperty2:.... / ItemCode: ... 이런 형태로 이해하겠습니다) 

일단 게임 진행 상에서 큰 문제는 없습니다. 일반적으로 아이템의 정보를 서버에서 로드해서 가지고 있게 되고 저장할때도 서버상의 데이터를 기준으로 string을 생성하면 되기 때문입니다. 

다만, 유지보수 및 성능상의 문제점이 발생할 수 있습니다. 

1. 아이템의 Property가 늘어날 경우 전체 데이터에 대해서 Convert 해야 합니다. (정규화가 되어 있는 경우 칼럼 하나만 추가하면 됩니다). 같은 이치로 특정 아이템을 삭제한다고 하더라도 전체 컨버트 작업이 필요합니다. - 이거 만만치 않고 시간도 많이 소요됩니다. 
2. 특정 아이템의 존재 여부/ 개수등의 상태를 파악하기 힘이 듭니다. 특정 아이템의 전체 개수를 파악할 경우 전체 Inventory 데이터를 모두 읽어서 컨버트 작업을 해야 합니다. 
3. MS-SQL 2000의 경우 (2005의 경우는 해결되기는 했습니다만) Page Size가 8K인데, Page Size를 넘는 row를 넣을 수 없습니다. 한 유저가 가질 수 있는 아이템의 수가 많아지고, 아이템의 프로퍼티가 많아질 경우 8K는 결코 큰 수치가 아닙니다. 
4. Database에서 제공하는 Constraint를 이용하기 힘듭니다(뭐 사실 그렇게 사용도 하지 않는 것 같습니다). 아이템의 Serial Number라던가 하는 부분들을 서버상에서 모두 체크해야 하며, DB 상에서 데이터의 정합성을 설명해 주지 못합니다. 
5. 데이터가 커질 경우 아이템의 작은 이동만으로도 해당 Page에 대해서 변경을 하기 때문에, Checkpoint시점에서 Disk I/O를 크게 증가시킵니다. 

당장 생각나는 건 이 정도인데, 사실 운영을 하다가 보면 상당히 많은 문제를 겪게 됩니다. 
정규화를 했을 때 발생하는 조인의 경우에는 충분히 튜닝으로 극복할 수 있는 부분이 많습니다. 
그럼에도 문제가 생긴다면 일부 데이터를 중복시켜서 비정규화 작업을 해야겠지요 
(사실 일반적으로 사용되는 비정규화 방법은 수직/수평 분할이 많은 편입니다. 이 경우에는 비정규화라고 하기에도 애매하지요) 

== 

MMORPG를 비롯하여 게임 개발은 아직까지는 완전한 100% 개발을 하고 지속적으로 수정없이 서비스가 가능하다고 생각하지 않습니다. 서버/클라이언트 구조가 유연해야 향후 기능의 추가/삭제가 쉽듯이, DB 구조도 최대한 정규화를 하는 것이 각종 요구사항에 대해서 유연할 수 있을 것이라고 생각합니다. 

다른 부분들은 많은 개발자분들이 대답해 주실 거예요 ^^