【发布时间】:2011-03-05 18:17:09
【问题描述】:
我最近在我的信息学课上学习了规范化,目前我正在开发一个使用 SQLite 作为后端数据库的多人游戏。
关于它的一些信息:
简化后的结构如下所示:
player_id | level | exp | money | inventory
---------------------------------------------------------
1 | 3 | 120 | 400 | {item a; item b; item c}
好的。如您所见,我在“库存”列中以字符串形式存储了一个表/数组。这是违反规范化的。
但问题是:为玩家的库存制作额外的桌子对我来说只会带来不利影响!
- 我访问数据库的唯一点是:
- 当玩家加入游戏并加载其个人资料时
- 保存玩家资料时
当玩家加入时,我从数据库中加载他的数据并将其存储在内存中。保存播放器时,我仅每五分钟写入一次数据库。所以我的脚本中实际上很少有 SQL 查询。
如果我为库存使用额外的表格,我将不得不在加载时:
- 执行性能查询,可能更多的数据密集型查询,以从属于玩家 X 的库存表中获取所有项目
- 遍历结果并将其转换为表格以存储在内存中
保存后:
- 从库存表中删除属于玩家 X 的所有物品(玩家可能已经丢弃/出售了一些物品?)
- 遍历表格并查询玩家拥有的每个物品
如果我将所有玩家数据保存在一张表中:
- 我只有一个用于保存和加载的查询
- 一切都在一个地方
- 我只需要在加载和保存时在我的脚本中(反)序列化表格
我现在该怎么办?
我的论点和情况是否有理由反对规范化?
【问题讨论】:
-
还要考虑的是
inventory列的数据类型。显然,通过您的方法,您将获得各种长度的字符串,并且您需要确保字符串值在它们变得太长时不会被截断。为了安全起见,您最终可能会得到text或varchar之类的数据类型(即长度不受限制),我不确定这是一个最佳决策,从性能角度来看。 -
如果稍后您想知道哪个玩家拥有某件物品怎么办?喜欢独特的物品或强大的物品?另外,如果物品可以升级、附魔、损坏或具有其他属性怎么办?
-
也许这个链接会对你有所帮助 - en.wikipedia.org/wiki/Denormalization
标签: sql database theory normalization