目前,我正在处理一个数据集,它只是一个redicolus;一个来自多个供应商的平面文件,没有韵律和原因;它大约有200列。这200个中有15个是常见的,我已经把它们拉到了另一个表中。
在其他185列中,它们是varchar、int的datetime和多个字符串值的混合。
现在,我正在尝试决定如何最好地存储其他185列;就像在扁平表中一样,目前证明它的伸缩性非常差。我有两个解决方案设置,但是我不知道哪一个更好。
一种是将每个列的元数据存储在单独的表中(如图所示)

但是,似乎使用这种方法会非常困难;如果以后我需要查询位于此处的项,则会非常困难。
我想到的另一种方法是将所有列放入一个具有id、值、数据类型的表中,而不是在进行查询时将值转换为数据类型THe:
select * from foo where cast(col_to_query) as int < 5然而,我不确定这样做时的性能如何。
问题:
这两种方法中哪一种性能更好,你会推荐哪一种(或者如果有更好的选择,我很想听听)。
谢谢
发布于 2011-04-21 10:50:33
第一种方法的伸缩性甚至比单个表更差,而且从查询到引导都非常困难。
我建议使用包含所有列的单个表作为开始方法。你说过它的伸缩性很差。您这是什么意思?它的伸缩性有多差?查询返回需要很长时间吗?您是否为您的查询正确地为表建立了索引?列数通常不会显著影响查询返回的时间,除非它们返回大量数据。如果是这样的话,如果所有的时间都花在mysql和客户端之间的数据传输上,那么在幕后存储数据的方式对查询响应时间几乎没有影响。在这种情况下,请确保只选择您关心的列。不要做"select *“。
另一种选择是使用表继承策略。在本例中,您将有一个存储15个常见属性的父表,以及一个根据记录所来自的文件来标识记录类型的“类型”,或者您也可以将其称为源。然后,为每个不同的文件创建一个1到0-1映射的扩展表,并仅为每个特定文件创建自定义列。这可能不会像一个大表那样执行得很好,因为您必须进行连接,但它将有助于减少对一个表上的一大堆列的需求,这些列通常为空。
这看起来像这样:
create table master (
master_id int not null auto_increment primary key,
type int,
<field1> int,
<field2> varchar(20),
...
);
create table file1_data (
master_id int not null primary key,
type int,
<field16> int,
<field17> varchar(20),
...
);按如下方式查询:
选择,,...from master inner join file1_data on file1_data.master_id = master.master_id where ...
https://stackoverflow.com/questions/5738911
复制相似问题