1

我有以下表格:

球员

  • ID
  • 选手姓名

武器

  • ID
  • 类型
  • 其他数据

武器对玩家

  • ID
  • 玩家ID_reference
  • 武器ID_reference

那很好也很简单。

现在我需要根据之前刚刚打包到otherData列中的一些特性从Weapons表中选择项目(因为它只在客户端需要)。问题是,这些类型具有不同的特征——但也有很多相似的数据。

所以我试图决定以下可能性,所有这些都有其优点和缺点。

解决方案 A

杀死 Weapons 表,并为每个 Weapon-Type 创建一个新表:

武器_剑

  • ID
  • 刀片类型
  • 损害
  • 其他数据

武器_枪支

  • ID
  • 准确性
  • 损害
  • 弹药类型
  • 其他数据

但是我将如何将这些链接到播放器

  • 为每种武器类型创建Weapons_Swords2Players、Weapons_Guns2Players ?(在为玩家加载所有武器时会导致更多的加入......并且插入新玩家也更复杂)

或者

  • 将另一列添加到名为WeaponsTypeTable的Weapons2Players中,然后对正确的 Weapons 子表进行子选择(似乎更容易,但不是很正确,我猜插入稍微容易一些)

解决方案 B

保留武器表,并添加我需要的所有字段。问题是会有NULL字段,因为并非所有武器类型都使用所有字段(不可能是正确的)

武器

  • ID
  • 类型
  • 准确性
  • 损害
  • 弹药类型
  • 刀片类型
  • 其他数据

这似乎是非常基本的东西,但我无法决定什么是最好的。还是有正确的解决方案C?

4

3 回答 3

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 涉及非规范化武器表。优点是获取数据并确保武器不会指向任何东西要简单得多。

如果各种武器类型的属性差异很大,那么我建议创建一个主武器表。如果有很多相似之处,那么您可以考虑非规范化解决方案。如果我不知道我会得到多少变化,我的倾向是使其尽可能标准化,从而使用主武器表。

于 2010-04-18T03:47:49.347 回答
0

我会采用你的两种方法的混合体。保留通用统计数据(id、type、damage、otherData)的武器表。然后创建 gun_stats (weapon_id, accuracy, ammoType) 和 Sword_stats (weapon_id, BladeType) 表,它们链接到武器的 id 并具有剩余的数据片段。您只需要两次查询即可为玩家获取两种类型的所有武器,并且没有任何数据重复。

于 2010-04-18T03:43:45.093 回答
0

现代数据库非常擅长处理稀疏数据。只要数据类型较小或宽度可变,添加一些额外的空白列不会造成任何问题。这将允许您在不使表结构复杂化的情况下提取一些信息。

另一种机制是为武器添加一些额外的索引表,这将帮助您在不修改武器表或角色加载代码的情况下进行搜索。根据您正在执行的搜索类型,该信息应该易于计算、存储和更新。

对于干净且真正可扩展的方法,我将不得不使用规范化表@Thomas。如果您只需要更进一步,上述方法中的一种或两种可能会帮助您到达那里。

于 2010-04-18T04:19:35.173 回答