动态表生成

时间:2009-10-31 18:33:40

标签: php ruby-on-rails database-design

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

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

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

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

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

由于 埃里克

3 个答案:

答案 0 :(得分:3)

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

经过一番思考......
您还可以查看 observation pattern ,看看是否可以将其改编为此示例。虽然模式是OO,但它可以在SQL中完成 这是一个有点长的解释,但我已经发表了simplified model here;希望您觉得这个有帮助。

observation_model_01

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果表的数量变得很大,自动创建表会让您头疼。对于拥有超过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会浪费时间。