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

时间:2009-07-08 08:31:00

标签: database-design

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

equipped_equipment(<characterid>, <equipmentid>, <slotid>)
slot(<slotid>, slotname)
equipment(<equipmentid>, equipment_name, equipment_script_name)

所以,为了找出角色装备的武器,我可以做到

SELECT equipmentid, equipment_name FROM equipment e, equipped_equipment eq
  WHERE e.equipmentid = eq.equipmentid AND eq.slotid = 'weapon' AND
  eq.characterid = 1

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

equipment (<characterid>, weapon_slot, armor_slot, accessory1_sot, accessory2_slot)

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

  1. 轻松添加新广告
  2. 避免空白条目 (......我可能错过的任何其他事情)
  3. 但是第二个非标准化解决方案允许我通过一个查询获取所有设备的ID,而添加新插槽只是添加一个新列。从长远来看哪一个更好?欢迎提出建议和改进!

1 个答案:

答案 0 :(得分:5)

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

我认为合理的道路是:

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

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