Php mysql:存储任意数据

Php mysql:存储任意数据,php,mysql,database,csv,Php,Mysql,Database,Csv,背景: 我问了一个关于在飞行中创建表的问题,接下来的对话是: 这真是个糟糕的主意!事实上,它有味道。 你到底想用它干什么?——下陷 @deceze:非常正确,但是,你会如何存储这些CSV文件的内容呢。 它们必须存储在mysql中以便索引。 关于他们唯一可靠的事实是,他们都有一个标准格式的移动专栏。 CSV可以有任意数量的列和任意数量的行。 它们可以毫不夸张地从单行、35列csv到80k行、单列csv。我对其他想法持开放态度海尔伍德 有很多解决方案,从属性值模式到 JSON存储和NoSQL存储。开

背景: 我问了一个关于在飞行中创建表的问题,接下来的对话是:

这真是个糟糕的主意!事实上,它有味道。 你到底想用它干什么?——下陷 @deceze:非常正确,但是,你会如何存储这些CSV文件的内容呢。 它们必须存储在mysql中以便索引。 关于他们唯一可靠的事实是,他们都有一个标准格式的移动专栏。 CSV可以有任意数量的列和任意数量的行。 它们可以毫不夸张地从单行、35列csv到80k行、单列csv。我对其他想法持开放态度海尔伍德 有很多解决方案,从属性值模式到 JSON存储和NoSQL存储。开 新问题。不管你做什么 但是,不要动态创建 桌子下陷

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

XML文件可以处理这种事情吗?使用XQuery在语言结构上与SQL相似,XML在动态添加数据方面没有问题。

存储任意长记录的一个非常简单的模式是:

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不是很好


如果你有选择的话,最合适的可能是a。

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

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

这让人想起SimpleDB的项和属性模型。如果您来自普通的RDB世界,请查看SimpleDB文档,了解您需要解释的一些奇怪之处,例如:

所有值都存储为文本,因此要对非字符串数据类型(通常是数字和日期)的值范围进行排序或选择,您需要

考虑一下您的查询将是什么样子。要获取属性为Color='Red'和Size>3的项目,可以从以下内容开始:

"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')
选择项目。*,大小。值为大小 从项目 将属性作为项目上的颜色进行内部连接。ItemID=Attributes.ItemID和Attributes.Name='Color' 作为项目大小的内部连接属性。ItemID=Attributes.ItemID和Attributes.Name='Size' 其中颜色.Value='Red'和大小.Value>'003'

您可以用两种替代方法构造此查询,但需要注意的主要事项是:

要根据的属性越多,需要的联接就越多。请注意,您不能简单地执行以下操作:选择。。。从Items内部使用ItemID连接属性,其中Attributes.Name='Color'和Attributes.Value='Red'以及Attributes.Name='Size'和Attributes.Value>'003'-一旦您看到它被写出来,这是不言而喻的

如果您想在响应中添加其他属性,则需要添加更多的联接I included Size,以显示对于其中一个已联接的属性来说很简单。但是,如果您想要检索一个响应,该响应包含针对所选项目的更多属性的列,该怎么办?查询将开始变得更加复杂。至少SimpleDB可以透明地为您处理这些内容,这样对查询的响应看起来就像您所期望的那样,具有指定属性的列


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

如果不知道,甚至无法猜测:它们来自哪里?它们是干什么用的?如何使用csv文件?