我有以下表格:
球员
- ID
- playerName
武器
- ID
- 型
- otherData
Weapons2Player
- ID
- playersID_reference
- weaponsID_reference
这很简单。
现在我需要从武器表中选择项目,根据我之前刚刚打包到 otherData 列中的一些特性(因为它只需要客户方)。问题是,类型具有不同的特征 - 但也有很多类似的数据。
所以我试图决定以下可能性,所有这些都有其优点和缺点。
解决方案A
杀死武器表,并为每个武器类型创建一个新表:
Weapons_Swords
- ID
- bladeType
- 损伤
- otherData
Weapons_Guns
- ID
- 精度
- 损伤
- ammoType
- otherData
但我如何将这些链接到玩家?
或
解决方案B
保留武器表,并添加我需要的所有字段。问题是那时会有 NULL 字段,因为并非所有的武器类型都使用所有字段(不能正确)
武器
- ID
- 型
- 精度
- 损伤
- ammoType
- bladeType
- otherData
这似乎是非常基本的东西,但我无法决定什么是最好的。或者是否有正确的解决方案C?
答案 0 :(得分:2)
一个解决方案是创建一个主武器表,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涉及对武器表进行非规范化。优点是获取数据并确保武器不会指向任何东西变得非常简单。
如果各种武器类型的属性差别很大,那么我建议创建一个主武器表。如果存在很多相似之处,那么您可以考虑非规范化解决方案。如果我不知道我会得到多少变化,我的倾向是尽可能地使它变得规范化,从而使用主武器表。
答案 1 :(得分:0)
我会采用你的两种方法的混合。保留常用统计数据的武器表(id,type,damage,otherData)。然后创建gun_stats(weapon_id,accuracy,ammoType)和sword_stats(weapon_id,bladeType)表,这些表链接到武器的id并具有剩余的数据片段。你只需要两个查询就可以为玩家获得两种类型的所有武器,并且没有任何数据重复。
答案 2 :(得分:0)
现代数据库在处理稀疏数据方面非常擅长。只要数据类型很小或可变宽度,添加一些空白的额外列不会造成任何麻烦。这将允许您提取一些信息,而不会使表结构复杂化。
另一种机制是为武器添加一些额外的索引表,以帮助您在不修改武器表或角色加载代码的情况下进行搜索。根据您正在进行的搜索类型,该信息应易于计算,存储和更新。
对于干净且真正可扩展的方法,我必须使用规范化的表@Thomas。如果您只需要进一步了解,上述一种或两种方法可能会帮助您实现目标。