【问题标题】:Should I split tables based on activity?我应该根据活动拆分表吗?
【发布时间】:2013-08-25 18:06:50
【问题描述】:

我正在开发一个在线游戏的业余爱好项目。该游戏将玩家数据存储在一个大的平面文件中。数据本身包含玩家的所有信息,从名称到玩家本身的物品。它本身就是一个相当多的列,并且有几十个项目只会增加启动的平面文件大小。

给你一个视觉。我当前的播放器文件是 192 列(不考虑项目)。

玩家数据

减少绒毛后,我的平面文件中有 51 列用于播放玩家数据。这不包括玩家的物品或能力。我已经决定可以将它们分成单独的表并与 FK 链接。

51 列数据对玩家来说是唯一的,不应重复。它们不是我被告知的正常化的良好候选者。

表格

  • 身份证
  • 姓名
  • 密码
  • 种族
  • 级别
  • 黄金
  • 经验
  • 任务
  • 盔甲
  • 实力
  • 智慧
  • 灵巧

活动

但是,选择和更新这些列中的某些列时的活动却大不相同。有些会在玩家移动时更新,有些会在玩家登录游戏并加载到内存时很少使用。记录永远不会被删除或重建。每列都有一个值。活动频率从每秒到每月一次不等。

问题

这让我想到了一个问题。如果它们在同一个表中,我是否可以根据活动将这些列拆分并提高性能,而不是传统的数据规范化方式?或者我应该把它们放在同一张表上,只依靠正确的索引?大多数列看起来不错,但就像我说的,有些列比其他列使用得更多。但是,当一些人比其他人更多地使用时,会有很大的不同。这让我很害怕。

【问题讨论】:

  • 您可以通过创建一个名为Activities 的存储活动信息的表来拆分它们。除此之外,真的很难说什么,因为你的问题没有太多细节。
  • 不太清楚我明白你的意思。我更新了活动描述以包含有关活动的更多详细信息。但是,问题是您是否可以根据某些列比同一张表中的其他列更活跃(选择或更新)来进行拆分?
  • 。 .您的数据一开始听起来并没有标准化。您似乎将不同的实体存储在一行中(用户和活动从问题中命名为两个)。我不清楚这个问题的意图。
  • 表格应该反映实体及其关系,例如 Player、Item、player_has_item、...
  • 如果您无法规范化内容并放入适当的实体/关系中,请尝试 NoSQL(MongoDB,...),它可以保存文档并且不在乎文档包含多少“列”。

标签: mysql sql database database-schema


【解决方案1】:

您提到的内容称为denormalization,实际上是一个众所周知且常见的问题。

没有关于何时进行非规范化的一般规则和指示。 这取决于每个项目的许多特定因素(例如硬件、数据库的类型以及您提到的“活动”等等),因此归结为对每个应用程序进行分析以得出结论。

此外,有时非规范化意味着将一个表拆分为两个具有一对一关系的表(就像您的情况一样)。有时这意味着摆脱 FK 并将所有内容放在一个包含许多列的 BIG 表中,以避免在选择时进行连接。

最重要的是,请记住,您的问题更多的是关于性能,而不是关于可扩展性。分成不同的表/数据库意味着您最终可以将数据存储在不同的机器中,每台机器都有特定的硬件架构和适合用例的数据库。


游戏行业的非规范化示例

当涉及到 MMORPG 时,我能想到的一个非规范化示例是将所有不经常更改的用户数据存储在 BLOB 中。这不仅是非规范化的,而且整行都存储为一系列字节。 Dr. E.F. Codd 一点也不高兴。

一家公司是Playfish

这意味着您有 更快 选择以 更慢 更新为代价,最重要的是,为用户更改架构变得非常麻烦(但这里的推理是不是一直是UsernamePasswordE-mail,直到时间结束)。这也意味着您的用户数据现在可以存储在更简单的键/值存储中,而不是具有更多开销的 RDBMS。当然,获取用户信息的登录服务器不需要像处理游戏的那样高性能。


因此,请尝试阅读有关非规范化的用例(这是一个非常活跃的主题),看看您可以在哪里应用您的发现。另外,请记住,预优化有时会适得其反,也许您现在应该专注于开发您的游戏。当您遇到扩展/性能问题时,您很可能会获得大量用户所带来的资金来解决问题。祝你好运!

【讨论】:

  • 这是第一代 MMORPG 的 MUD。我不打算对任何东西进行分片,因为它不会扩展到数百万非唯一帐户和唯一玩家记录,例如 Playfish 游戏。但是,架构、数据模型等可能仍然与任何其他 MMORPG 相同。只是没有大数据。但是,是的,谢谢分享。我想在根据实际数据和规模进行优化之前,我正在研究更多关于预优化的信息。
  • 啊,我明白你现在的意思了:在规范化期间,数据库设计者将不同但相关类型的数据存储在称为关系的单独逻辑表中。当查询将多个表中的数据组合到一个结果表中时,称为连接。同一查询中的多个联接可能会对性能产生负面影响。引入非规范化并添加少量冗余对于减少连接数量很有用。
  • 如果我将所有内容拆分为单独的表格。为了拼凑播放器文件,我将不得不对该数据进行多次连接。当玩家在玩游戏时,这也需要经常发生。这就是我问这个问题的理想原因。因此,通过非规范化,我可以如上所述减少连接数。检查!
  • 考虑到如何重做我的数据模型让我创建新模型的任务变得更加困难。谢谢:D
  • 哦,别担心。我已经启动并运行了游戏。 MUD 是开源的(不以营利为目的)。我已经这样做了 15 年。它实际上引导我在游戏行业工作,在那里我帮助推出了多个 AAA MMORPG。我只是不是 DBA 或程序员。我从事营销工作。我这样做是为了好玩。 ;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-25
  • 1970-01-01
  • 2021-06-14
  • 2013-02-04
  • 2013-03-02
  • 2015-06-06
相关资源
最近更新 更多