动态表生成

首先让我描述一下我的情况,以便你能够更好地帮助我。 有两个部分。

1:我有一个运行并分析一堆文件的程序。 它生成一个“报告”,稍后将其输入网站进行数据库存储和查看。 此报告可以包含几乎任何类型的数据,因为用户可以查询几乎任何内容。 我把它打开了。

2:网站通过此报告进行解析,为常见事项添加条目。 但是也为它找到的任何新数据创建了一个新表。 它还存储从report_id到所有这些动态创建的表的映射。 例如,如果在报告中有人想要计算标准偏差,这对于此报告是有意义的,那么就会有一个STD表。

现在这个网站是用PHP编写的,看起来有些混乱。 有没有更好的方法来做这个PHP。 另外,我正在考虑在Rails中重新编写这个,因为组织起见。 在rails中是否有更好的方法,“method_missing?”。

我不是很擅长建立网站,也不是DB的业余爱好者,所以请善待。

谢谢Eric

看起来你有非结构化的,或者至多是半结构化的数据。 除非您使用XML作为存储,否则经典的关系数据库表并不理想。 您可以考虑使用中间报告定义语言 ,然后将其存储在数据库中,通常以XML格式存储。 MS SQL服务器,Oracle和DB2支持XML数据的存储和查询。

经过一番思考..
您还可以查看观察模式 ,看看是否可以将其调整为此示例。 虽然模式是OO,但它可以在SQL中完成。
这是一个有点长的解释,但我在这里发布了一个简化的模型 ; 希望您觉得这个有帮助。

observation_model_01

在运行时修改数据库的结构非常危险。 我建议将未知或新遇到的信息存储在“混合”类型表中,您也可以在其中为信息提供“标记”以识别它。 如果您遇到新类型的信息(例如标准差),您可以创建一个新标记(有点像文件扩展名),并在信息表中添加与其关联的标记的信息。 如果创建新表,则更改架构,因此更改数据库的使用规则。

如果表的数量变得很大,自动创建表可能会让您头疼。 对于拥有超过5000个项目的目录,ext3中的目录列表开始感觉很昂贵,当你获得超过100,000个文件时肯定相当费时。 (mysql CLI将在连接时尝试缓存所有表名,要跳过它,您需要连接-A开关。)

您可以考虑使用临时表来创建报告,然后可能将结果压缩到报告字符串中以便稍后检索。 或者,正如JP所提到的,表格结构在同一个表中标记值和报告:

create table stddev ( report_id int(11), field_name int(11), -- fk to field field_value double ); create table reports ( report_id int(11); report_name varchar(255); ); 

要获取一个报告的数据,您可以选择指定report_id:

 select * from stddev where report_id = 123; 

我会为您的报表名称,字段名称创建表格,并且您可能希望将输入值与为报表保存的派生/计算值分开。

根据您输入新数据的频率,我不会过早地从几个大表优化到许多小表。 正确索引,大表可以很好地执行。

但是,此应用程序正在处理的数据量是多少? 是否有理由开始使用这么多小表?

我使用PHP来处理大量数据。 如果您的架构有意义,那么它也会使PHP代码更有意义。 如果是我,我不会改用不同的编程语言,我会坚持我的开始,直到我遇到语言的真正结构性限制; 对我来说,切换到Rails会浪费时间。