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

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

刚开始我想我会在角色的物品表中制作外键-十二个物品表中的每一个都有一个键。但是,由于每个项目只能是一个“类型”,这将导致每行有11个空字段,这似乎是错误的。

有什么更好的方法?我还没有建立数据库,因此我可以招待不使用十二个项目表的其他库存创意,但是要知道:管理界面将允许用户根据需要添加/删除/修改每种类型的项目。

另外,我想坚持最好的规范化做法,因此我将忽略不可避免的“谁在乎?只要做些有效的事并使用可为空的字段”。

最佳答案

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

CHARACTER --<- CHAR_ITEMS  ->-- ITEM_TYPES_STI

如果不是,请尝试Class Table Inheritance。基本上,为“项目类型”定义一个 super 表,角色的项目引用该表。 12种单独项目类型的每个子表还引用了项目类型超表:
CHARACTER --<- CHAR_ITEMS  ->-- ITEM_TYPES_SUPER --- ITEM_TYPE_SWORDS

关于您的评论:我已经澄清了上面的这一行。 item_types_super和item_type_swords之间的关系应为1:1。也就是说,对于剑中的每一行, super 剑应该有不同的行。这样做的方法是使剑中的外键也成为其主键。

但是,并非 super super 英雄的每一行都拥有一排剑。 super中的行可以用盾牌,轴或其他任何行引用。但是只能按一个子类型。这个想法是所有项目类型共有的列都属于super,而特定于子类型的列则位于每个子类型表中。

关于database-design - 规范化该数据库: what would be ideal in this scenario?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3305712/

10-13 09:22