规范化这个数据库:在这种情况下理想的是什么?

时间:2010-07-22 04:05:42

标签: database-design normalization

我正在设计一个角色有很多项目的游戏,这些项目可以是多种类型。有一个角色表,以及按类型细分的十二个不同的可能项目表(如武器,装甲和各种其他项目类型)。

我想创建一个表来保存这些项目类型的实例(基本上是字符的项目表),每一行都有一个来自字符表的外键,以指示哪个字符拥有该项目的所有权。

起初我想我会在字符的项目表中创建外键 - 十二个项目表中的每一个都有一个键。但由于每个项目只能是一个“类型”,这会导致每行中有11个空字段,这似乎是错误的。

什么是更好的方法?我还没有构建数据库,所以我可以接受其他不使用十二个项目表的库存想法,但是知道这一点:管理界面将允许用户根据需要添加/删除/修改每种类型的项目。 / p>

另外,我想坚持最好的规范化实践,所以我会忽略不可避免的“谁在乎?只做有效的工作并使用无效字段。”

4 个答案:

答案 0 :(得分:3)

我首先检查你是否可以将这12张桌子统一为一张。从Single-Table Inheritance开始,因为它很简单,我敢打赌在这种情况下它就足够了。

CHARACTER --<- CHAR_ITEMS  ->-- ITEM_TYPES_STI 

如果没有,请尝试Class Table Inheritance。基本上,为“项目类型”定义一个超级表项,并且字符的项目引用它。 12个单独项目类型的每个子表也引用了超类型的项目类型:

CHARACTER --<- CHAR_ITEMS  ->-- ITEM_TYPES_SUPER --- ITEM_TYPE_SWORDS

重新评论:我已澄清上述内容。 item_types_super和item_type_swords之间的关系应为1:1。也就是说,对于剑中的每一行,超级中应该有一个不同的行。这样做的方法是将剑中的外键也作为主键。

但并非超级中的每一行都有一排剑。 super中的行可以用盾,轴或其他行中的行引用。但只有一个子类型。这个想法是所有项类型共有的列属于super,而特定于子类型的列属于每个子类型表。

答案 1 :(得分:1)

如果您使用了以下表格(我只包含列的键值)。 CHARACTERS_ITEMS表包含每个字符的项目列表。 ItemTypeID和ItemID的组合将用于引用12个项目表之一中的行。

CHARACTERS
----------
CharacterID (PK)

ITEMS
-----
ItemID (PK)

ITEM_TYPES
----------
ItemTypeID (PK)

CHARACTERS_ITEMS
----------------
CharacterID (FK)
ItemTypeID (FK)
ItemID (FK)

以下是视图的开头,也可能有所帮助。它演示了ItemTypeId如何用于引用适当的表。

CREATE VIEW v_character_items
AS
SELECT {list of columns}
FROM character_items
JOIN character_item_1 on character_items.ItemID = character_item_1.ItemID and character_items.ItemTypeID = 1

UNION 
SELECT {list of columns}
FROM character_items
JOIN character_item_2 ON character_items.ItemID = character_item_2.ItemID and character_items.ItemTypeID = 2

UNION
{other tables...}

答案 2 :(得分:1)

在你的情况下,我会尝试将所有十二个表合并回一个表。

这样做的原因与技术表设计无关 - 而是它会让你的角色以意想不到的方式重用对象。

例如,你可以拥有一系列可抛出的属性,例如力量,精确度,伤害,破坏,所以匕首几乎不会投掷,并且如果它瞄准目标会造成很大的伤害,另一方面一个高脚杯很容易投掷,但造成的伤害非常小,或者金条难以投掷,但即使严格来说不是武器,也会造成合理的伤害。  它还可以让你拥有同样具有巨大价值或神奇用途的“宝藏”物品的武器(不知道你正在计划什么样的游戏,所以这些例子可能不合适

答案 3 :(得分:1)

我不知道你是否还在寻找回复,但这是我最近的做法:

CHARACTER -> Char/Item Link Table -> ITEM

ITEM
----
ID
NAME
TYPE
etc.

这允许您创建多个角色可以拥有的基本项目。如果你想对可以通过EFFECT表(或类似的东西)轻松完成的项目(即宝石插槽,附魔等)进行单独的角色修改:

ITEM -> Item/Effect Link Table -> EFFECTS

通过这种方式,你可以让角色定制自己的武器,并保持基础。您还可以创建一组效果,而无需为游戏中的每个项目反复重复这些效果。