Одним из решений является создание основной таблицы оружия, к которой у 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 заключается в денормализации таблицы оружия. Преимущество состоит в том, что значительно проще получать данные и гарантировать, что оружие не указывает ни на что.
Если атрибуты различных типов оружия значительно различаются, я бы рекомендовал создать таблицу мастер-оружия. Если есть много общего, то вы можете рассмотреть денормализованное решение. Если бы я не знал, какую дисперсию я получу, я бы хотел сделать ее максимально нормализованной и, таким образом, использовать основную таблицу оружия.