MySQL中的字段太多了?

时间:2012-02-23 19:38:05

标签: mysql database-design

几年前,我开发了一个游戏统计网站作为学习项目。它今天仍然使用,我想让它清理一下。

数据库是需要改进的一个领域。我有一个游戏统计表,其中包含GameID,PlayerID,Kills,Deaths,DamageDealt,DamageTaken等。总共有50个字段,可以在将来添加更多字段。在什么地方有太多的领域?它目前有57,341行,单独为153.6 MiB。

我还有一些字段可以在同一个表中的BLOB中存储数组。数组的一个例子是Player vs Player matchups。该阵列存储该玩家在游戏中杀死另一个玩家的次数。这些是filesize中较大的字段。是否将数组存储在建议的BLOB中?

数组看起来像:

        [Killed] => Array
            (
                [SomeDude] => 13
                [GameGuy] => 10
                [AnotherPlayer] => 8
                [YetAnother] => 7
                [BestPlayer] => 3
                [APlayer] => 9
                [WorstPlayer] => 2
            )

这些人不会超过10人。

4 个答案:

答案 0 :(得分:2)

我更喜欢没有一个具有未确定列数的表(还有更多的列),而是拥有一个标签和值的关联表,因此每个用户都有一个id,你可以使用该id作为密钥进入标签和价值表。这样您就只能存储每个用户所需的数据。我相信这种方法被称为EAV(根据Triztian的评论),它是如何保存医学数据库的,因为对于个体患者来说有很多潜在的领域,即使任何给定的患者只有非常少数的具有实际数据的领域

所以,你有

user:
id | username | some_other_required_field

user_data:
id | user_id | label | value

现在,您可以根据需要为每个用户提供尽可能多的user_data行。

[编辑]

对于你的数组,我也会用关系表对待它。类似的东西:

player_interraction:
id | player_id | player_id | interraction_type

这里你会存储两个有互动的玩家以及它们的互动类型。

答案 1 :(得分:1)

桌子设计似乎很好。只要您存储的列无法从同一行中的其他列计算。 IE,你没有存储SelfKills,OtherDeath和TotalDeaths(其中TotalDeaths = SelfKills + OtherDeath)。这没有意义,可以从你的桌子上删除。

我很想知道如何将这些数组存储在BLOB中 - 它们在BLOB中的用途是什么?为什么不将它们标准化为易于数据转换和分析的表格? (或者是它们,它们只是作为一个数组存储在这里,以便于向最终用户显示数据)。

另外,我很好奇你的BLOB占用的数据与表的其余部分相比。一般来说,行的大小并不像行数那么大,而且~60K根本没什么大不了的。只要您不编写需要检查每个列值的查询(理想情况下,您在尝试编写where子句时忽略blob)。

答案 2 :(得分:1)

使用mysql,你有大约4000列(字段)的硬限制,每行总存储量为65Kb。如果您需要存储大字符串,请使用文本字段,它们存储在磁盘上。 Blob确实应该保留用于非文本数据(如果必须的话)。

一般不要担心数据库的大小,但要考虑结构以及它的组织和索引方式。我看过小db的运行就像垃圾一样。

如果您仍然想要数字,当您的总数据库达到GB范围或者在一个表中超过几十万行时,那么就开始担心更多关于事情的事情 - 60K行中的150M并不多扫描不会在性能上花费太多。但是,现在是确保在大量使用的查询上创建良好覆盖索引的时候了。

答案 3 :(得分:1)

随着时间的推移,向数据库表添加列没有任何问题。数据库设计一直在变化。要记住的是数据如何分组。我一直将数据库表视为类似项的集合。

我认为的事情如下:

将数据插入行时,有多少列为空? 这个新专栏是否适用于我已经存在的80%的数据? 我是否会对此表中的几列进行多次更新? 如果是这样,我是否需要跟踪普遍存在的值以防万一?

通过考虑这样的数据,你可能会发现你需要将你的桌子分成几个由外键链接在一起的小桌子。