Mysql 在数据库中存储数组是可以接受的情况吗?

Mysql 在数据库中存储数组是可以接受的情况吗?,mysql,arrays,database-design,multidimensional-array,Mysql,Arrays,Database Design,Multidimensional Array,我一直在开发一个应用程序,遇到了这样一种情况:我想对当前数据进行快照 例如,在此应用程序中,用户将具有不同的统计信息,并能够输入匹配项。他们在比赛中的排名取决于他们的统计数据。当比赛确定后,应用程序将提取用户的所有当前统计数据并确定他们的分数,以查看谁获胜 现在比赛结束后,我希望用户能够查看过去的比赛,当我想显示比赛时参与者的分数时,问题就出现了。我认为存储这样结构的阵列是可以接受的: array( array(username, points), array(username, point

我一直在开发一个应用程序,遇到了这样一种情况:我想对当前数据进行快照

例如,在此应用程序中,用户将具有不同的统计信息,并能够输入匹配项。他们在比赛中的排名取决于他们的统计数据。当比赛确定后,应用程序将提取用户的所有当前统计数据并确定他们的分数,以查看谁获胜

现在比赛结束后,我希望用户能够查看过去的比赛,当我想显示比赛时参与者的分数时,问题就出现了。我认为存储这样结构的阵列是可以接受的:

array(
 array(username, points),
 array(username, points),
 etc.
)
现在,正常情况下,规范化数据可能是最佳做法,但在这种情况下:

  • 在一场比赛中,225参与者可以在任何地方
  • 数据永远不会更新,只能读取
  • 我认为将它放在数据库的数组结构中可以节省我在后端代码中构造数组的时间
  • 编辑:数据不是永久性的。比赛记录将在比赛结束7天后删除。
有人能告诉我这个解决方案是否会带来任何问题吗


编辑 我将在序列化数组后保存数据,因此在我的数据库中,我将有一个名为“matches”的表和一个名为“results”的列

此列的行将包含序列化数组。因此,如果数组看起来是这样的:

$array["a"] = "Foo";
$array["b"] = "Bar";
$array["c"] = "Baz";
$array["d"] = "Wom";
那么数据库中的行将如下所示:

a:4:{s:1:"a";s:3:"Foo";s:1:"b";s:3:"Bar";s:1:"c";s:3:"Baz";s:1:"d";s:3:"Wom";}

这个解决方案在短期内不会带来任何问题,但假设您希望最终添加功能,以显示用户玩过的所有游戏,或他们得分最高的游戏。。。如果将此数据放在无法从sql访问的数组中,则不允许您具有这些功能

我想这样的桌子会很完美:

CREATE TABLE game_scores(
    id int AUTO_INCREMENT NOT NULL PRIMARY KEY,
    game_id int,
    user_id int,
    final_score int,
    KEY(game_id),KEY(user_id)
)
在每一场游戏结束时,您只需为每一个正在玩该轮游戏的用户插入一行,其中包含相应的分数和游戏id。稍后,您就可以选择某一游戏的所有分数:

SELECT * FROM game_scores WHERE game_id=?
。。。或显示某个用户的所有分数:

SELECT * FROM game_scores WHERE user_id=?

等等,玩得开心

如果您真的致力于问题中概述的用例以及您对Sean Johnson的评论中的限定,那么我认为您的方法没有任何问题


如果您认为有可能挖掘历史信息,我仍然可以通过建议您规范化数据来证明这一点,但将数组作为长寿命(相对而言)缓存转储到数据库中可能是有意义的。换句话说,以两种格式存储它,但是您概述的用例的主线只会触及数组格式,但是,如果您需要的话,您仍然可以以可查询的形式保存数据。

当然,您可以对其进行序列化,但从我的角度来看,我认为最好只是提出一个更好的模式,并保持数据的规范化。就我的两分钱。我不清楚你是在谈论数据的非规范化,还是在一个字段中实际存储一块数据。你能提供一个你正在考虑的表格结构的例子吗?不管怎样,我想如果你走这条路,你很可能会在路上的某个地方被咬。编写规范化结构的额外工作将使其在将来更易于修改。@Ickster我已经添加了您要求的示例。您应该阅读临时数据库(snodgras)这是一个很好的解决方案,但我忘了提到,匹配项在结束后最多7天内才能查看。这种情况违背了设计模式来说明这种功能的目的。如果是临时数据,然后,我认为插入序列化数据没有问题,除非您希望能够处理数据,而不仅仅是显示分数屏幕。我还建议使用
json_encode
而不是
serialize
,json不仅更小,而且对我们人类来说更容易阅读。:)注意到了。感谢您的回复。我可能会采用这种方法,因为我99.9%确信,除了我指定的数据用途之外,我不需要其他任何数据。然而,很难说应用程序将如何随时间发展。我将继续并接受这一正确答案。