我有以下表格:
玩家
身份证件
playerName公司
武器
身份证件
类型
其他数据
武器玩家
身份证件
playersID_参考
不良反应参考
很简单很好。
现在我需要从武器表中选择一些项目,根据它们的一些特性,我之前刚刚将它们打包到otherData列中(因为它只在客户端需要)。问题是,这些类型有不同的特征,但也有很多相似的数据。
所以我试着决定以下的可能性,所有这些都有其利弊。
解决方案A
杀死武器表,为每种武器类型创建一个新表:
兵器剑
身份证件
叶片类型
损害
其他数据
武器枪
身份证件
精确
损害
弹药类型
其他数据
但是我要怎么把这些和球员联系起来呢?
为每种武器类型创建武器2层,武器2层玩家?(当玩家装载所有武器时,会产生更多的连接…而且插入新玩家也更复杂)

在Weapons2Players中添加另一列称为weaponsyTable的元素,然后对正确的Weapons2Players子表进行子选择(看起来更容易,但不是很正确,我猜插入起来稍微容易一点)
解决方案B
保留武器表,加上我需要的所有字段。问题是会有空字段,因为不是所有武器类型都使用所有字段(不可能是正确的)
武器
身份证件
类型
精确
损害
弹药类型
叶片类型
其他数据
这似乎是很基本的东西,但我只是不能决定什么是最好的。或者有正确的解决方案C吗?

最佳答案

一种解决方案是创建一个主武器表,武器剑和武器枪具有外键引用,例如:

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包括取消武器表的规格化。这样做的好处是,获取数据和确保武器不指向任何东西要简单得多。
如果不同武器类型的属性差异很大,那么我建议创建一个主武器表。如果有很多相似之处,那么可以考虑非规范化的解决方案。如果我不知道我会得到多少变化,我的倾向是使它尽可能正常化,从而使用主武器表。

关于sql - 如何“缩放”这三个表?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2661024/

10-12 19:46