数据库结构

时间:2013-09-10 08:13:24

标签: mysql database design-patterns database-design

我正在创建一个游戏网站,其中包含游戏中的项目数据库(数千个),我想知道数据库结构的最佳实践。

有5种物品类型:武器,盔甲,药水,任务物品和垃圾。其中每个都具有不适用于其他项目的唯一属性。例如,武器可以是不同类型(即双手,主手,副手),装甲可以是不同的重量(板,皮革)等。

一切都是'项目',但我想知道我是否应该有一个项目表,即:

item id, item_type ... item_weapon_type_id, item_armor_weight_id

因此在一个表中具有所有可能的属性。

或每种项目类型的单独表格,即:

weapon_id, weapon_type, weapon_name

我想知道这一点,因为每个项目类型都有许多独特的属性,这意味着单个项目表会有很多列,其中许多列不适用于表格中80%的项目。 / p>

提前感谢您的帮助。

3 个答案:

答案 0 :(得分:3)

我认为使用名为Item-Base-Type的项类型的基表会很有用,它包含所有项类型的共享属性。
每个项目类型(如盾牌)将有一个单独的表格(如shield-type)与Item-Base-Type有一对一的关系。
包含游戏所有项目的Item表格将包含Item-Base-Type的外键 我想你需要将一些辅助表格如Effect添加到模型中 is-quest-item将是Item表的属性 看一下the wiki可能会有所帮助。

template of game items

答案 1 :(得分:2)

有两张桌子:

<强>武器

  • WeaponId
  • 描述

<强> WeaponType

  • WeaponTypeId
  • WeaponId
  • 描述(单手,双手等)

这样你可以拥有相同的武器,但只能单手或双手配备。

分离表将规范化数据库并提高性能。例如,当您想要可用的基本武器列表时,您不会选择重复的行。

答案 2 :(得分:1)

你可以制作两张桌子:

    • id - PK
    • 名称
    • some_attribute
    • some_other_attribute
  1. item_attributes

    • item_id - PK
    • attribute_name - PK
    • ATTRIBUTE_VALUE
  2. 将公共属性(例如价格,权重......)放在items表中,其余属性放在属性表中。

    另外,如果items中的某些字段未用于所有类型,请不要太担心。 2-3个枚举字段应该足以描述物品的类型,护甲'重物',武器类型等......(至少在我看过的游戏中)。