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

Ste*_*hen 6 database-design normalization

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

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

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

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

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

Bil*_*win 3

我首先检查是否可以将这十二张表统一为一张。从单表继承开始,因为它很简单,而且我敢打赌在这种情况下它就足够了。

CHARACTER --<- CHAR_ITEMS  ->-- ITEM_TYPES_STI 
Run Code Online (Sandbox Code Playgroud)

如果没有,请尝试类表继承。基本上,为“项目类型”定义一个超级表,并且角色的项目引用它。12 个单独项目类型的每个子表还引用项目类型超表:

CHARACTER --<- CHAR_ITEMS  ->-- ITEM_TYPES_SUPER --- ITEM_TYPE_SWORDS
Run Code Online (Sandbox Code Playgroud)

回复您的评论:我已经澄清了上面的内容。item_types_super 和 item_type_swords 之间的关系应该是 1:1。也就是说,对于 Swords 中的每一行,Super 中应该有一个不同的行。做到这一点的方法是将剑中的外键设为主键。

但并非超级中的每一行都有剑中的一行。super 中的行可以由shield 或axes 等中的行引用。但仅限于一种亚型。这个想法是,所有项目类型共有的列都属于超级表,而特定于子类型的列则属于每个子类型表。