主要的动机是在我的rails应用程序中渲染一个条形图(使用highcharts)。 我有一个CSV(30MB)的数据文件(静态数据),有1096列和14000行。我想将它保存在数据库(MYSql)中。最初我想保存为数组。
请告诉我如何完成(通过记住数据性能)。 你认为创建1096列会不错?
任何帮助将不胜感激。
谢谢
答案 0 :(得分:0)
1096列相当大。问题是,CSV是否高度非规范化?您是否有代表相同数据的列?如果是这样,那么您可以为每组重复列创建一个表。这会减少您的列数,但会增加您的桌数。
MySQL允许每行最大大小为65,535字节。这意味着每列的平均大小不能超过59.79字节。
每行将数据分解为单个文本列可能有效,但您无法对数据进行任何分析。但是,如果将其转换为JSON,则可以将其存储在MongoDB或PostgreSQL数据库中。
你的问题没有一个正确答案。
答案 1 :(得分:0)
为:
id Mon Tue Wed
1 12 27 8
2 19 26 4
3 12 NULL 7
好:
id day value
1 Mon 12
1 Tue 27
1 Wed 8
2 Mon 19
2 Tue 26
2 Wed 4
3 Mon 12
3 Wed 7
这将导致3列和大约1500万行。
3列和1500万行比1096列和14000行更容易管理。
答案 2 :(得分:0)
1096列当然不是一个好主意,特别是如果数据列是可变的,并且您希望稍后处理具有不同列的文件。拥有大量固定列将成为存储数据的一种非常不灵活的方式。
如果每一列都是一天,并且每一行都是某种度量,那么您可以尝试将数据存储在一个包含3列的表中:日期,度量,值。使用这样的表,每个日期 - 度量 - 值三元组将有一行(每个"单元格"在您的csv文件中)。这使得该表非常灵活,可以添加新的日期和/或度量。
但是,如果您想进行任何类型的分析(包括将数据显示为图表),您将面临将数据重新加入与初始CSV相同的表格结构的问题。这可能是非常大的数据集的性能瓶颈,因为它在O(X * Y)时间内求解,其中X是行数,Y是列数。我没有太多使用MySQL的经验,但过去我使用PostgreSQL的CROSSTAB功能进行了这种重组。
这只是一种方法,您必须进行相当多的实验才能获得最佳性能。您也可以查看NoSQL选项。正如已经说过的那样,实际上没有一个正确的答案。