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

Sql 有条件地将Postgres行链接到各种其他表中的数据,sql,postgresql,database-design,Sql,Postgresql,Database Design,我有一个产品表,它使用来自不同供应商的CSV提要进行更新。每个提要都有自己的表,但是产品可以在同一个供应商表和多个供应商表中多次出现。但每种产品只能在主表中出现一次。我预计使用的供应商表不会超过10个。表格至少每天更新一次,最多每6-8小时更新一次,并且读取速度比写入速度优先级更高。在任何给定的时间,通常有大约500000个启用的产品 我的第一个计划是将每个产品的表名和主键ID存储在该表中,然后在每次更新期间重新计算,但根据,必须这样做表明数据库设计不正确 使用视图将这些表合并到单个虚拟表中似乎

我有一个产品表,它使用来自不同供应商的CSV提要进行更新。每个提要都有自己的表,但是产品可以在同一个供应商表和多个供应商表中多次出现。但每种产品只能在主表中出现一次。我预计使用的供应商表不会超过10个。表格至少每天更新一次,最多每6-8小时更新一次,并且读取速度比写入速度优先级更高。在任何给定的时间,通常有大约500000个启用的产品

我的第一个计划是将每个产品的表名和主键ID存储在该表中,然后在每次更新期间重新计算,但根据,必须这样做表明数据库设计不正确

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


所以我想这里的问题是,有没有正确的方法?还是不管我怎么做都会一团糟?另外,我的思路是否正确?

使用一个统一所有提要表的视图可以很好地简化查询的形式,但您不能为视图编制索引。(好吧,在Oracle中,我认为您可以为
物化视图编制索引,但这是一个特例)

从结构上看,我觉得有点怀疑您将供应商提要拆分为单独的表;这样做可以简化并加快供应商提要的更新,对于查询特定的单个提要来说,这无疑是最快的选择,但对于更新(重新计算?)主表来说,这很难看,而且,支持主表的行与从中提取它们的特定供应商提要相关联是完全不合理的

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


辅助表可以编制索引,可以根据查询需要连接到主表,并且可以相当高效地查询。如果合适,可以使用它来更新主表。

Hmm,为什么不创建一个包含所有供应商数据的产品表呢?在该表中有一个字段来标识哪个供应商。当您在您的输入源中,更新这一个表,而不是为每个供应商单独设置一个表。如果您使用COPY将CSV文件导入db表,可以,但导入的表只是一个临时工作表。请立即将数据从该表复制到“真实”表中,统一表。然后可以删除或截断导入表,或者更可能是保留该表以进行故障排除。但在程序中不使用它


您应该能够使用单个insert语句从导入表复制到统一表。即使表很大,我也希望这会很快。总的来说,为每个导入执行一次大规模插入几乎肯定比拥有一个对10个表进行并集并尝试使用它的视图要快。如果统一表具有所有他收集了所有供应商的数据加上一个供应商字段,我不明白为什么您需要查询原始导入表。除了,也就是说,为了解决导入的问题,但是很好,所以您可以保留它们。除非您的磁盘空间有限,因此保留每个记录的副本是一个问题,否则我不会这样做hink这将是一个简单的解决方案。如果磁盘空间是一个问题,那么在将数据复制到统一表后立即删除导入表,并将原始导入保留在备份介质上的某个位置。

在供应商表中,它们是否都有相同的列?是否有一个列引用priduct表,是否有一个列这可以识别供应商?如果答案是肯定的,那么正确的方法可能是一个供应商表,或者使用sql inhertance组合多个供应商表,否则这是一个非常难看的级联联合查询。我会用另一种方法来做:创建一个包含所有产品的供应商列的单一表sing触发器允许插入到视图中。@Jasen:供应商库存表都是通过CSV文件的副本直接拉入的。大多数字段是相同的,但也有一些不同。我们偶尔需要直接查询供应商表,所以我不想将它们合并到一个表中。@a_horse_,没有名称:这很好不知道我们现在是如何做的,但是我们在将新数据与历史数据合并时遇到了很多困难。(而且,什么是“历史”并不总是很清楚。)我们存储的数据也比wePostgres实现的视图多得多(尽管它们不会自动更新)根据我的理解,您可以为视图使用的函数编制索引,不是吗?无论如何,我越深入研究它,我的最佳选择似乎就是在SQL之外进行链接。可能是在Rails中。在过去,我通过使用Rails Activerecord API和设置大量SQL功能,获得了巨大的性能提升但是,这可能不是其中之一。不,您不能为(普通)视图的定义查询编制索引。