我正在用C ++开发一个小应用程序,并使用PostgreSQL作为后端数据库。与我的数据库中的其他表一起有一个"projects"
表。根据此表的每个主键,在我的数据库中动态添加一个新表。
示例:
假设项目表包含以下3行:
--------------------------------
| Id |Other Columns Goes here |
--------------------------------
| 1 | |
--------------------------------
| 2 | |
--------------------------------
| 3 | |
--------------------------------
所以在这种情况下我还有三个以上的表
Table1
,Table2
,Table3
现在您可能会注意到表名是通过附加项目生成的.Id在固定字符串的末尾,即“Table
”。
对于某些项目,也可能没有生成表。
示例:
假设项目表包含以下3行:
--------------------------------
| Id |Other Columns Goes here |
--------------------------------
| 1 | |
--------------------------------
| 2 | |
--------------------------------
| 3 | |
--------------------------------
所以在这里我可能只发现我的数据库中有两个表:
Table1
,Table3
现在我只需要获得所有有效的项目。目前我正在使用以下算法:
//part1
SELECT * FROM Projects Table
get the projects info one by one from the results of above query and store them in new instance of my Custom Class Project
Store the above instance in some contianer e.g Vector say vProjects
//part 2
For each Project p in vProject
if (TableExist(p.Id))
Store p in a new container say vValidatedProjects
Note: The TableExist() method execute the following query:
SELECT COUNT(*) FROM pg_tables WHERE tablename = 'Table"+ p.Id + "'"
现在每件事都按预期工作正常但是!!!程序执行速度非常慢,只是因为上面的算法的第二部分,如果我们有一千个项目,TableExist()方法也被称为千次,每次调用此方法时,执行一个新的查询减慢程序:(
我心中的解决方案就是这样的事情
//part1
SELECT * FROM Projects Table
WHERE a table exist angainst projets.Id
get only those projects info for whom a dynamic table exist. From the results of above query and store them in new instance of my Custom Class Project
Store the above instance in some contianer e.g Vector say vProjects.
现在通过这种方式,只有一个查询为我们完成了工作,而不是N + 1个查询(其中N不是Projects表中的行) 但我不知道如何编写这样一个返回上述结果的查询。请帮助我实现这个目标。
答案 0 :(得分:2)
更改设计将是最佳解决方案。
如果这不是一个选项,那么你可以改变第二部分:
//part 2
For each Project p in vProject
if (TableExist(p.Id))
Store p in a new container say vValidatedProjects
Note: The TableExist() method execute the following query:
SELECT COUNT(*) FROM pg_tables WHERE tablename = 'Table"+ p.Id + "'"
by,首先在projects
表中添加一个新的布尔列(让我们将其命名为projects.TableExists
)
然后,运行当前的TableExist()
函数并填充该列。另外,为项目创建表的代码,也更新该列以及删除表的代码,以便相应地更新列。
然后你的第二部分将是:
//part 2
For each Project p in vProject
if (p.TableExists)
Store p in a new container say vValidatedProjects
Note: The TableExist() method will not be used any more
答案 1 :(得分:1)
我希望在其中有一个包含project_id的表,并使用where project_id = ...
进行所有选择。这将导致更好的表统计信息,表优化器将会做得更好。