这是将数组存储在数据库中的可接受情况吗?
Posted
技术标签:
【中文标题】这是将数组存储在数据库中的可接受情况吗?【英文标题】:Is this an acceptable situation to store an array in a database? 【发布时间】:2012-09-08 19:14:29 【问题描述】:我一直在开发一个应用程序,并且遇到了一种情况,我想对当前数据进行快照。
例如,在此应用程序中,用户将拥有不同的统计数据并能够输入匹配项。他们在比赛中的排名取决于他们的数据。确定比赛后,应用程序将提取用户的所有当前统计数据并确定他们的分数以查看谁获胜。
现在,在比赛结束后,我希望用户能够查看过去的比赛,但当我想显示比赛时参与者的分数时,问题就出现了。我认为存储这样结构的数组是可以接受的:
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";
【问题讨论】:
嗯,你总是可以序列化它,但从我的角度来看,我认为最好只是想出一个更好的模式并保持你的数据标准化。只是我的两分钱。 我不清楚您是在谈论非规范化数据,还是在字段中实际存储一块数据。你能提供一个你正在考虑的表结构的例子吗?不管怎样,我认为如果你走这条路,你可能会在路上的某个地方被咬。编写规范化结构的额外工作将使其在未来更容易修改。 @Ickster 我已经添加了您要求的示例。 你应该阅读时间数据库(snodgras) 【参考方案1】:此解决方案在短期内不会造成任何问题 - 但假设您希望最终添加功能以显示用户玩过的所有游戏,或者他们得分最高的游戏......将这些数据保存在inaccessible-from-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=?
等等。玩得开心!
【讨论】:
一个很好的解决方案,但我忘了提到比赛结束后最多只能查看 7 天。这违背了设计架构以解决此类功能的目的。 如果它是临时数据,那么我认为只插入序列化数据没有问题,除非您希望能够对数据进行处理而不仅仅是显示分数屏幕。 我还想建议使用json_encode
而不是serialize
,json不仅更小,而且对我们人类来说更容易阅读。 :)
正式注明。感谢您的回复。【参考方案2】:
如果您真的致力于问题中概述的用例以及您对 Sean Johnson 的评论中的资格,那么我认为您的方法没有任何问题。
如果您认为有可能挖掘历史信息,我仍然可以通过建议您对数据进行规范化来证明这一点,但是将数组作为一种长期存在(相对而言)的方式转储到数据库中缓存可能有意义。换句话说,以两种格式存储它,但是您概述的用例的主线将只使用数组格式,但如果您需要,您仍然可以以可查询的形式获得数据。
【讨论】:
我可能会采用这种方法,因为我有 99.9% 的把握,除了我指定的用途之外,我不需要其他任何数据。然而,很难说应用程序将如何随着时间的推移而发展。我将继续并接受这个作为正确答案。以上是关于这是将数组存储在数据库中的可接受情况吗?的主要内容,如果未能解决你的问题,请参考以下文章