Как «масштабировать» эти три таблицы? - PullRequest
1 голос
/ 18 апреля 2010

У меня есть следующие таблицы:

Игроки

  • ID
  • Playername

Оружие

  • ID
  • Тип
  • * 1023 другие данные *

Weapons2Player

  • ID
  • playersID_reference
  • weaponsID_reference

Это было красиво и просто.

Теперь мне нужно выбрать элементы из таблицы Weapons , в соответствии с некоторыми из их характеристик, которые я ранее только что упаковал в столбец otherData (так как это было необходимо только на клиенте боковая сторона). Проблема в том, что типы имеют различные характеристики, но также много похожих данных.

Так что я пытаюсь определиться со следующими возможностями, у каждого из которых есть свои плюсы и минусы.

Раствор A

Убейте таблицу оружия и создайте новую таблицу для каждого типа оружия:

Weapons_Swords

  • ID
  • bladeType
  • повреждение
  • 1067 * другие данные *

Weapons_Guns

  • ID
  • точность
  • повреждение
  • ammoType
  • 1083 * другие данные *

Но как мне связать их с игроками ?

  • создать Weapons_Swords2Players, Weapons_Guns2Players для каждого типа оружия? (Это приведет к гораздо большему количеству СОЕДИНЕНИЙ при загрузке игрока всем его оружием ... и также сложнее вставить нового игрока)

или

  • добавить еще один столбец к Weapons2Players с именем WeaponsTypeTable , а затем выполнить подвыборы для правильной таблицы оружия (кажется, проще, но не совсем правильно, немного легче вставить, я думаю)

Раствор B

Держите таблицу оружия и добавьте в нее все поля, которые мне нужны. Проблема в том, что тогда будут поля NULL , так как не все типы оружия используют все поля (не может быть правыми)

Оружие

  • ID
  • тип
  • точность
  • повреждение
  • ammoType
  • bladeType
  • 1133 * другие данные *

Это кажется довольно простой вещью, но я просто не могу решить, что лучше. Или есть правильное решение C?

Ответы [ 3 ]

2 голосов
/ 18 апреля 2010

Одним из решений является создание основной таблицы оружия, к которой у Weapons_Swords и Weapons_Guns есть ссылки на внешние ключи, например:

Create Table Weapons
{
    Id ...
    , ...
}

Create Table Weapons_Swords
{
    Id...
    , ...
    , Constraint FK_Weapons_Swords_Weapons
        Foreign Key ( Id )
        References Weapons( Id )
}
Create Table Weapons_Guns
{
    Id...
    , ...
    , Constraint FK_Weapons_Guns_Weapons
        Foreign Key ( Id )
        References Weapons( Id )
}

Тогда у вас будет стандартная таблица PlayerWeapons:

Create Table PlayerWeapons
{
    PlayerId ..
    , WeaponId ..
    , Constraint FK_PlayerWeapons_Players
        Foreign Key ( PlayerId )
        References Players( Id )
    , Constraint FK_PlayerWeapons_Weapons
        Foreign Key ( WeaponId )
        References Weapons( Id )
}

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

Ваше решение b заключается в денормализации таблицы оружия. Преимущество состоит в том, что значительно проще получать данные и гарантировать, что оружие не указывает ни на что.

Если атрибуты различных типов оружия значительно различаются, я бы рекомендовал создать таблицу мастер-оружия. Если есть много общего, то вы можете рассмотреть денормализованное решение. Если бы я не знал, какую дисперсию я получу, я бы хотел сделать ее максимально нормализованной и, таким образом, использовать основную таблицу оружия.

0 голосов
/ 18 апреля 2010

Современные базы данных чертовски хороши в обработке разреженных данных. Добавление нескольких пустых столбцов не вызовет никаких проблем, если тип данных небольшой или переменной ширины. Это позволит вам извлечь некоторую информацию, не усложняя структуры таблиц.

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

Для чистого и по-настоящему масштабируемого подхода мне пришлось бы использовать нормализованные таблицы @Thomas. Если вам просто нужно немного продвинуться, один или оба из вышеперечисленных подходов могут помочь вам туда добраться.

0 голосов
/ 18 апреля 2010

Я бы взял гибрид ваших двух подходов.Держите таблицу оружия для общих характеристик (идентификатор, тип, урон, другие данные).Затем создайте таблицы gun_stats (Weapon_id, точность, ammoType) и Sword_stats (Weapon_id, bladeType), которые ссылаются на идентификатор оружия и имеют оставшиеся части данных.Вам понадобится всего два запроса, чтобы получить все виды оружия обоих типов для игрока, и при этом никакого дублирования данных не будет.

...