有条件地将Postgres行链接到各种其他表中的数据

时间:2015-01-06 19:51:36

标签: sql postgresql database-design

我有一个产品表,使用来自不同供应商的CSV Feed进行更新。每个Feed都有自己的表,但产品可以在同一个供应商表和多个供应商表中多次出现。每个产品只能在我们的主表中出现一次。我预计不会使用超过十个不同的供应商表。表至少每天更新一次,最多每6-8小时更新一次,读取速度比写入速度高得多。在任何给定时间通常都会有大约500,000个已启用的产品。

我的第一个计划是在每个产品的表中存储表名和主键ID,然后在每次更新期间重新计算它,但根据the responses here,必须这样做表明数据库不是& #39; t设计正确。

使用视图将这些表组合到一个虚拟表中似乎对组织有很大帮助。这样,我可以创建一个规则,使一列成为SQL查询,然后索引该列以提高搜索/读取速度。决定从何处提取供应商信息的规则并未涉及,需要考虑国家和价格,以及其他一些事项。

所以我想这里的问题是,有没有正确的方法呢?或者无论我怎么做,它都会变得混乱吗?我也在正确的轨道上吗?

2 个答案:

答案 0 :(得分:1)

使用统一所有Feed表的视图可能会简化查询的形式,但您无法索引视图。 (好吧,在Oracle中我认为你可以索引一个MATERIALIZED视图,但那是一个特例)。

在结构上,我发现有点怀疑你将供应商的订单分成不同的表格;这样做可以简化和加快供应商供稿的更新,对于针对特定的个别供稿的查询来说,它肯定是最快的选择,但是对于更新(重新计算?)主表来说它很难看,而且它对于支持主表的行与库中的行相关联。

如果您需要对供应商供稿进行快速查询,而不是主表,并且您还需要将主表与包含供应商特定信息的详细信息表相关联,那么您最好的选择可能是保持物理辅助表作为所有每个供应商表的UNION ALL(这要求这些表具有相同的结构),每个表具有不同的供应商ID。在Oracle中,您可以将其自动化为MATERIALIZED VIEW,但对于大多数DBMS,您需要手动维护该表。

可以对辅助表进行索引,可以根据需要在查询中连接到主表,并且可以相当有效地查询。如果合适,它可用于更新主表。

答案 1 :(得分:1)

嗯,为什么不创建一个包含所有供应商数据的产品表?在该表中有一个标识哪个供应商的字段。获取输入源后,请更新此表,而不是为每个供应商分别创建一个表。如果你使用COPY将CSV文件导入到db表中,那很好,但是导入的表只是一个临时工作表。立即将数据从那里复制到真实的统一表中。然后可以删除或截断导入表,或者更有可能将其保留以进行故障排除。但是你不能在程序中使用它。

您应该能够使用单个insert语句从导入表复制到统一表。即使表格很大,我也希望速度快。对于每个导入执行一次大量插入几乎肯定会比在10个表上执行联合并尝试使用它的视图更快。如果统一表包含来自所有供应商的所有数据以及供应商字段,那么我不明白为什么您需要查询原始导入表。除了,对于导入的问题解决问题,但很好,所以你可以保留它们。除非你限制磁盘空间,以便保留每个记录的重复数量是一个问题,我认为这将是一个简单的解决方案。如果磁盘空间有问题,请在将数据复制到统一表后立即删除导入表,并将原始原始导入保留在备份介质上的某处。