如何'缩放'这三个表?

时间:2010-04-18 03:32:36

标签: sql mysql structure scale

我有以下表格:

  

球员

     
      
  • ID
  •   
  • playerName
  •   
     

武器

     
      
  • ID
  •   
  •   
  • otherData
  •   
     

Weapons2Player

     
      
  • ID
  •   
  • playersID_reference
  •   
  • weaponsID_reference
  •   

这很简单。

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

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

解决方案A

杀死武器表,并为每个武器类型创建一个新表:

  

Weapons_Swords

     
      
  • ID
  •   
  • bladeType
  •   
  • 损伤
  •   
  • otherData
  •   
     

Weapons_Guns

     
      
  • ID
  •   
  • 精度
  •   
  • 损伤
  •   
  • ammoType
  •   
  • otherData
  •   

但我如何将这些链接到玩家

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

  • 将另一列添加到名为 WeaponsTypeTable Weapons2Players ,然后对正确的Weapons子表进行子选择(看起来更简单,但不是很正确,稍微更容易插入i猜)

解决方案B

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

  

武器

     
      
  • ID
  •   
  •   
  • 精度
  •   
  • 损伤
  •   
  • ammoType
  •   
  • bladeType
  •   
  • otherData
  •   

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

3 个答案:

答案 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。如果您只需要进一步了解,上述一种或两种方法可能会帮助您实现目标。