Нормализация этой базы данных: что было бы идеально в этом сценарии? - PullRequest
6 голосов
/ 22 июля 2010

Я разрабатываю игру, в которой у персонажа много предметов, и эти предметы могут быть разных типов.Существует таблица символов и двенадцать различных таблиц возможных предметов в разбивке по типу (например, оружие, доспехи и различные другие типы предметов).

Я хочу создать таблицу для хранения экземпляров этих типов предметов(в основном таблица элементов символов) каждая строка будет иметь внешний ключ из таблицы символов, чтобы указать, какой персонаж владеет этим элементом.

Сначала я подумал, что сделаю внешние ключи в символах 'таблица предметов - один ключ для каждой из двенадцати таблиц предметов.Но поскольку каждый элемент может иметь только один «тип», это привело бы к одиннадцати пустым полям в каждой строке, и это кажется неправильным.

Какой подход лучше?Мне еще предстоит создать базу данных, поэтому я могу развить другие идеи инвентаризации, в которых не используются двенадцать таблиц элементов, но знаю это: интерфейс администратора позволит пользователю добавлять / удалять / изменять элементы каждого типа по мере необходимости.

Кроме того, я хотел бы придерживаться лучшей практики нормализации, поэтому я буду игнорировать неизбежное «Кого волнует? Просто делайте то, что работает, и используйте пустые поля».

Ответы [ 4 ]

3 голосов
/ 22 июля 2010

Сначала я бы проверил, можете ли вы объединить эти двенадцать таблиц в одну.Начните с Наследование одной таблицы , потому что это просто, и я уверен, что в этом случае этого будет достаточно.

CHARACTER --<- CHAR_ITEMS  ->-- ITEM_TYPES_STI 

Если нет, попробуйте Наследование таблиц классов .По сути, определите supertable для «item type» и ссылки на элементы персонажа.Каждая вложенная таблица для 12 отдельных типов элементов также ссылается на supertable типов элементов:

CHARACTER --<- CHAR_ITEMS  ->-- ITEM_TYPES_SUPER --- ITEM_TYPE_SWORDS

Ваш комментарий: я пояснил строку выше.Соотношение между item_types_super и item_type_swords должно быть 1: 1.То есть для каждой строки в мечах должна быть отдельная строка в супер.Способ сделать это состоит в том, чтобы сделать внешний ключ в мечах также его первичным ключом.

Но не каждая строка в супер имеет строку в мечах.На строку в super может ссылаться строка на экране, или оси, или что-то еще.Но только по одному подтипу.Идея состоит в том, что столбцы, общие для всех типов элементов, принадлежат super, а столбцы, относящиеся к подтипу, идут в каждую таблицу подтипов.

1 голос
/ 28 июля 2010

Не знаю, ищите ли вы ответы, но вот как я это сделал совсем недавно:

CHARACTER -> Char/Item Link Table -> ITEM

ITEM
----
ID
NAME
TYPE
etc.

Это позволяет создавать базовые предметы, которыми могут обладать несколько персонажей. Если вы хотите выполнить модификацию отдельных персонажей для предметов (например, прорезание драгоценного камня, зачарование и т. Д.), Это легко сделать через таблицу EFFECT (или что-то подобное):

ITEM -> Item/Effect Link Table -> EFFECTS

Таким образом, вы можете настроить персонажей на собственное оружие и при этом держать базу вокруг. Вы также можете создавать набор эффектов без необходимости повторять их снова и снова для каждого элемента в вашей игре.

1 голос
/ 22 июля 2010

В вашем случае я бы попытался объединить все двенадцать таблиц обратно в одну таблицу.

Причина этого на самом деле не связана с дизайном технических таблиц, а скорее позволит вашим персонажам повторно использоватьобъекты неожиданными способами.

Например, вы можете иметь набор бросаемых атрибутов, таких как EFFORT, ACCURACY, DAMAGE, BREAKAGE, так что кинжал будет почти без усилий бросать и причинять много травм, если он заклепит цель.с другой стороны, кубок было бы легко бросить, но нанести очень мало урона, или золотой слиток было бы трудно бросить, но причинил бы разумное количество травм, даже если это не строго говоря оружие.Это также позволило бы вам иметь оружие, которое также являлось «сокровищницей» объектов, представляющих большую ценность или магическое использование (не знаю, какую игру вы планируете, поэтому эти примеры могут не подходить

1 голос
/ 22 июля 2010

Если вы использовали следующие таблицы (я включил только ключевые значения для столбцов).Таблица CHARACTERS_ITEMS содержит список элементов для каждого символа.Комбинация ItemTypeID и ItemID будет использоваться для ссылки на строку в одной из 12 таблиц элементов.

CHARACTERS
----------
CharacterID (PK)

ITEMS
-----
ItemID (PK)

ITEM_TYPES
----------
ItemTypeID (PK)

CHARACTERS_ITEMS
----------------
CharacterID (FK)
ItemTypeID (FK)
ItemID (FK)

Здесь также может быть полезно начало представления.Он демонстрирует, как ItemTypeId может использоваться для ссылки на соответствующую таблицу.

CREATE VIEW v_character_items
AS
SELECT {list of columns}
FROM character_items
JOIN character_item_1 on character_items.ItemID = character_item_1.ItemID and character_items.ItemTypeID = 1

UNION 
SELECT {list of columns}
FROM character_items
JOIN character_item_2 ON character_items.ItemID = character_item_2.ItemID and character_items.ItemTypeID = 2

UNION
{other tables...}
...