나는 모든 사람에 대해 약간 동의하지 않고 여기에서 관계형 접근 방식이 합리적이라고 말합니다. 여기서 흥미로운 점은 항목이 여러 역할을 가질 수 있다는 것입니다. 주요 문제는 코드 에서이 관계형 레이아웃과 OO 레이아웃 간의 매핑이 "자연스럽지 않다"고 생각하지만 데이터베이스 측면에서 여러 역할이 깔끔하게 표현 될 수 있다고 생각합니다 (이상한 인코딩이나 중복없이 조인). .
첫 번째로 결정해야 할 것은 항목 별 데이터 양과 지정된 유형의 모든 항목이 공유하는 양입니다.
모든 데이터가 항목별로 지정된 경우 수행 할 작업은 다음과 같습니다 .
// ITEMS table: attributes common to all items
item_id | name | owner | location | sprite_id | ...
1 | Light Saber | 14 (Tchalvek) | 381 (Tchalvek house) | 5663 | ...
// WEAPONS table: attributes for items that are weapons
item_id | damage | damage_type | durability | ...
1 | 5 | sharp | 13 | ...
// LIGHTING table: attributes for items that serve as lights
item_id | radius | brightness | duration | ...
1 | 3 meters | 50 | 8 hours | ...
이 디자인에서 모든 항목은 모든 (또는 대부분의) 항목의 속성과 함께 항목 테이블에 있습니다. 항목이 수행 할 수있는 각 추가 역할은 별도의 테이블입니다.
무기로 사용하려면 무기 테이블에서 찾아보십시오. 그것이 있으면 무기로 사용할 수 있습니다. 존재하지 않으면 무기로 사용할 수 없습니다. 기록의 존재는 그것이 무기인지 여부를 알려줍니다. 그리고 거기에 있다면, 모든 무기 특유의 속성이 거기에 저장됩니다. 이러한 속성은 인코딩 된 형식 대신 직접 저장되므로 쿼리 / 필터를 사용하여 수행 할 수 있습니다. 예를 들어 게임의 메트릭 페이지의 경우 무기 손상 유형별로 플레이어를 집계 할 수 있으며 일부 조인과 그룹 별 damage_type을 사용하여이를 수행 할 수 있습니다.
아이템은 여러 역할을 가질 수 있으며 둘 이상의 역할 별 테이블 (이 예에서는 무기와 조명 모두)에 존재할 수 있습니다.
"이것이 보류 가능"과 같은 부울 인 경우 Items 테이블에 넣습니다. 무기와 기타 역할 테이블을 조회 할 필요가 없도록 "무기"등을 캐싱하는 것이 좋습니다. 그러나 중복성을 추가하므로 동기화 상태를 유지해야합니다.
일부 데이터가 항목마다 다르지 않은 경우 유형별 로 추가 테이블을 사용하는 Ari의 권장 사항 도이 방법과 함께 사용할 수 있습니다. 예를 들어 무기 피해가 항목마다 다르지 않지만 역할이 여전히 항목마다 다른 경우 공유 무기 속성을 표로 분류 할 수 있습니다.
// WEAPONS table: attributes for items that are weapons
item_id | durability | weapon_type
1 | 13 | light_saber
// WEAPONTYPES table: attributes for classes of weapons
weapon_type_id | damage | damage_type
light_saber | 5 | energy
항목별로 수행되는 역할이 항목별로 다르지 않고 항목 유형별로만 다른 경우가 있습니다. 이 경우 item_type을 Items 테이블에 저장하고 ItemTypes 테이블에 "무기", "보존 가능"및 "가벼움"과 같은 속성을 저장할 수 있습니다. 이 예제에서는 항목 이름도 항목마다 다르지 않습니다.
// ITEMS table: attributes per item
item_id | item_type | owner | location
1 | light_saber | 14 (Tchalvek) | 381 (Tchalvek house)
// ITEMTYPES table: attributes shared by all items of a type
item_type | name | sprite_id | is_holdable | is_weapon | is_light
light_saber | Light Saber | 5663 | true | true | true
// WEAPONTYPES table: attributes for item types that are also weapons
item_type | damage | damage_type
light_saber | 5 | energy
게임 중에 아이템 유형과 무기 유형이 변경되지 않을 가능성이 있으므로 해당 테이블을 한 번 메모리에로드하고 데이터베이스 조인 대신 해시 테이블에서 해당 속성을 조회 할 수 있습니다.