数据库设计:规范化还是不规范化

Ext*_*kun 1 database-design

我正在制作一款轻型RPG游戏,其中角色可以装备武器,装甲和2个配件插槽.这是一个可能的解决方案:

equipped_equipment(<characterid>, <equipmentid>, <slotid>)
slot(<slotid>, slotname)
equipment(<equipmentid>, equipment_name, equipment_script_name)
Run Code Online (Sandbox Code Playgroud)

所以,要找出角色装备的武器,我能做到

SELECT equipmentid, equipment_name FROM equipment e, equipped_equipment eq
  WHERE e.equipmentid = eq.equipmentid AND eq.slotid = 'weapon' AND
  eq.characterid = 1
Run Code Online (Sandbox Code Playgroud)

但是这与这样的架构相比如何呢?

equipment (<characterid>, weapon_slot, armor_slot, accessory1_sot, accessory2_slot)
Run Code Online (Sandbox Code Playgroud)

当然,使用上面的三个表(有些规范化 - 我可能将设备名称分开并放入equipment_details表或某种类型)它允许我

  1. 轻松添加新插槽
  2. 避免空白条目(...我可能错过的任何其他内容)

但是第二个非标准化解决方案允许我通过一个查询获取所有设备的ID,而添加新插槽只是添加一个新列.从长远来看哪一个更好?欢迎提出建议和改进!

Vin*_*vic 5

这有很多骗局,我会让别人找到他们:-)

我认为合理的道路是:

  • 有一个规范化的数据库
  • 创建非规范化视图
  • 编写您的应用程序以查询这些视图
  • 简介(拥有大量客户)
  • 如果db肯定是一个瓶颈,那么配置文件更难找出涉及哪些表,然后优化数据库(索引,查询计划等)
  • 再次介绍
  • 如果db仍然是瓶颈,那么您可以对视图的界面进行非规范化(因此您不必更改应用程序)

这样做的原因是修复数据损坏,重复或不一致错误很难,有时甚至是不可能的,所以尽量努力通过规范化获得正确的性能.只有这样,如果你已经证明你无法获得理想的性能,那么尝试非规范化,只需要进行非规范化.