背景
我正在问question on stack overflow关于在这场对话中随时创建表格的问题:
这闻起来像个糟糕的主意!事实上,它闻起来just like this one 你想用它做什么? - deceze
<小时/> @deceze:非常正确,但是,如何保存这些CSV文件的内容 它们必须存储在mysql中以进行索引。 关于它们的唯一可靠事实是它们都有一个标准格式的移动列 CSV可以具有任意数量的具有任意行数的列 它们可以(毫不夸张地)从单行,35列csv到80k行单列CSV。我对其他想法持开放态度。 - Hailwood
从属性值模式到有很多解决方案 JSON存储和NoSQL存储。打开一个 关于它的新问题。不管你做什么 但是,不要动态创建 表! - deceze
问题:
所以我的问题是,
您认为存储此数据的最佳方式是什么?
您是否同意 deceze 关于不创建动态表?
答案 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文档,看看你需要考虑的一些奇怪之处,例如:
所有值都存储为文本,因此要对非字符串数据类型(通常是数字和日期)进行排序(或选择值范围),您需要采用some unusual steps, including zero-padding and offsets so that data sorts correctly "lexicographically".
考虑您的查询会是什么样子。要获取具有Color ='Red'和Size&gt; 3等属性的项目,您可以从以下内容开始:
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的列。
重点是以这种方式存储数据相当容易,但查询它变得更难。如果您的数据集变大,您可能需要考虑索引属性的正确方法。