【问题标题】:Dynamic Table Generation动态表生成
【发布时间】:2010-12-11 22:18:58
【问题描述】:

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

1: 我有一个运行和分析一堆文件的程序。它会生成一份“报告”,该报告随后将被送入网站以供数据库存储和查看。该报告可以包含几乎任何类型的数据,因为用户几乎可以查询任何内容。我把它留得很开放。

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

现在这个网站是用 PHP 编写的,看起来有点乱。有没有更好的方法来做这个 PHP。另外,出于组织考虑,我正在考虑在 Rails 中对其进行重新设计。 Rails 中有没有更好的方法,“method_missing”。

我不太擅长建网站,对 DB 很业余,所以请善待。

谢谢 埃里克

【问题讨论】:

  • 你有机会发布一些代码吗?在我们看到你现在的表现之前,很难说你是否可以做得“更好”。
  • 很抱歉,我没有这台电脑上的代码。基本上,在报告中会有一个字符串,如:名称:standard_deviation 类型:浮点值:1.22243 在网站中,它检查表standard_deviation 是否存在。如果它这样做,它将添加这个值,否则它会创建表。整个事情感觉很老套,而且非常脆弱。

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


【解决方案1】:

看起来您拥有非结构化数据,或者充其量是半结构化数据。除非您使用 XML 作为存储,否则经典的关系数据库表并不理想。您可以考虑提出一个中间report-definition language,然后将其存储在数据库中,通常作为 XML。 MS SQL server、Oracle、DB2支持XML数据的存储和查询。

经过一番思考..
您还可以查看 observation pattern 并查看是否可以将其调整到此示例中。虽然模式是面向对象的,但是可以用SQL来完成。
这是一个有点长的解释,但我已经发布了simplified model here;希望您觉得这个有帮助。

【讨论】:

  • 你是对的,这肯定行得通。我的问题实际上归结为没有定义我希望能够处理的所有数据类型。非常感谢。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    如果表的数量变得庞大,自动创建表可能会让您头疼。 ext3 中包含超过 5000 个项目的目录列表开始感觉很昂贵,并且当您获得超过 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 会浪费时间。

    【讨论】:

      猜你喜欢
      • 2012-11-15
      • 1970-01-01
      • 2010-10-11
      • 2015-12-16
      • 2014-08-23
      • 2012-04-02
      • 2015-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多