mysql:存储任意数据

时间:2011-01-17 03:45:17

标签: php mysql database csv

背景
我正在问question on stack overflow关于在这场对话中随时创建表格的问题:

  

这闻起来像个糟糕的主意!事实上,它闻起来just like this one   你想用它做什么? - deceze   

<小时/>   @deceze:非常正确,但是,如何保存这些CSV文件的内容   它们必须存储在mysql中以进行索引。   关于它们的唯一可靠事实是它们都有一个标准格式的移动列   CSV可以具有任意数量的具有任意行数的列   它们可以(毫不夸张地)从单行,35列csv到80k行单列CSV。我对其他想法持开放态度。 - Hailwood   
  从属性值模式到有很多解决方案   JSON存储和NoSQL存储。打开一个   关于它的新问题。不管你做什么   但是,不要动态创建   表! - deceze

问题:
所以我的问题是, 您认为存储此数据的最佳方式是什么? 您是否同意 deceze 关于不创建动态表?

4 个答案:

答案 0 :(得分:2)

用于存储任意长记录的非常简单的架构是:

Table `records`
===============
id
created
... other meta data ...

Table `record_attributes`
=====================
id
record_id
attribute
value

因此可以像这样存储CSV记录:

"Foo","Bar","Baz"     // column names
42,"Lorem","Jerry"    // first record
7,"Ipsum","Tom"       // second record
...

records(1, '2010-1-17', ...)
record_attributes(1, 1, 'Foo', 42)
record_attributes(2, 1, 'Bar', 'Lorem')
record_attributes(3, 1, 'Baz', 'Jerry')

records(2, '2010-1-17', ...)
record_attributes(4, 2, 'Foo', 7)
record_attributes(5, 2, 'Bar', 'Ipsum')
record_attributes(6, 2, 'Baz', 'Tom')

另一种方法是将记录数据作为JSON打包的blob存储在单个列中。如果您不需要搜索数据,这是最紧凑的方式,尽管不是很RDBMS。

如果您有这个选项,最合适的可能是NoSQL database

答案 1 :(得分:0)

XML文件可以使用这种东西吗?使用XQuery使其在语言结构上与SQL类似,并且XML在动态添加数据时没有问题。

答案 2 :(得分:0)

您也可以查看亚马逊的SimpleDB。它专门为此目的而设计。它允许您在所有记录和索引中添加任意属性。我确信在NoSQL领域也可能有其他解决方案。

答案 3 :(得分:0)

我想详细说明deceze的记录/记录属性答案,但评论不够......

这让人联想到SimpleDB的Items和Attributes模型。如果你来自普通的RDB世界,请查看SimpleDB文档,看看你需要考虑的一些奇怪之处,例如:

SELECT Items。*,Sizes.Value AS Size     来自物品     INNER JOIN属性AS颜色ON Items.ItemID = Attributes.ItemID AND Attributes.Name ='Color'     INNER JOIN属性AS大小ON Items.ItemID = Attributes.ItemID AND Attributes.Name ='Size'     WHERE Colors.Value ='Red'和Sizes.Value&gt;'003'

您可以通过几种替代方式构建此查询,但需要注意的主要事项是:

  • 您想要过滤的属性越多,您需要的JOIN就越多。请注意,您不能简单地执行:SELECT ... FROM Items INNER JOIN Attributes USING ItemID WHERE(Attributes.Name ='Color'AND Attributes.Value ='Red')AND(Attributes.Name ='Size'AND Attributes。价值&gt;'003') - 一旦你看到它写出来就不言而喻

  • 如果您想在响应中添加其他属性,则需要添加更多连接(我包含大小以显示其中一个已经JOINed属性的简单)。但是,如果要检索具有所选项目的大量属性列的响应,该怎么办?查询将开始变得更加复杂。至少SimpleDB透明地为您处理这些内容,因此对查询的响应看起来与您期望的一样,具有指定Attributes的列。

重点是以这种方式存储数据相当容易,但查询它变得更难。如果您的数据集变大,您可能需要考虑索引属性的正确方法。