将数组存储在数据库中是否可接受?

时间:2012-09-16 05:14:46

标签: mysql arrays database-design multidimensional-array

我一直在开发一个应用程序,我遇到了一个我希望获取当前数据的快照的情况。

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

现在比赛结束后,我希望用户能够查看过去的比赛,当我想要显示参赛者在比赛时所指出的内容时,就会出现问题。我认为存储这样结构的数组是可以接受的:

array(
 array(username, points),
 array(username, points),
 etc.
)

现在正常化数据可能是最佳做法,但在这种情况下:

  • 比赛中 2 25 参赛者之间可以有任何地方。
  • 数据永远不会更新,只能读取。
  • 我认为在数据库中的数组结构中使用它将节省我在后端代码中构建数组的时间。
  • 编辑:数据不是永久性的。比赛记录将在比赛结束后 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";}

2 个答案:

答案 0 :(得分:1)

这个解决方案在短期内不会造成任何问题 - 但是你想最终添加功能来展示用户玩过的所有游戏,或者他们的最高得分游戏......拥有这些数据在一个不可访问的来自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=?

等。玩得开心!

答案 1 :(得分:0)

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

如果你认为你有可能想要挖掘历史信息,但是将数组作为一个长期存在的(相对来说)类型转储到数据库中,我仍然可以通过建议你对数据进行规范化来证明这一点。缓存可能有意义。换句话说,以两种格式存储它,但是您概述的用例的主线只会达到数组格式,但如果您需要,您仍然可以使用可查询的形式获取数据。