事实
- 数据库:PostgreSQL(最新)
- 编程语言:Java
问题陈述(简化)
我们有 2 个表格 - 概述和详细信息。 “概述”中可能有数百万行,“概述”中的每一行在“详细信息”中可能有数百万行与之关联。外键details.overview_id指的是overview.id。大多数查询都是一般形式
SELECT * FROM details WHERE overview_id = xxx AND details.id > yyy AND details.id < zzz;
如果我们只有一张明细表,查询就会太慢(尽管明细查询几乎总是在主键上)。
更多关于明细的本质数据库 Activity :概览上的 INSERT 和 UPDATE 很少发生。对细节的 INSERT 发生得很快,而对同一个表的 UPDATE 几乎不会发生,而批量 DELETE 有时会发生。
我们已经拥有的
过去,我们使用原始 SQL 将表“详细信息”与“概述”中的每一行进行分区。 (实际上,我们并没有真正分区,而是根据模板创建了新表。这些表没有任何名为overview_id的列(节省存储空间),而是我们有一个单独的表,用于在overview.id和特定分区表的表名。)因此,正如您所理解的,分区必须在概览中插入新行时动态生成,并在从概览中删除行时删除分区。所有这些都是在应用程序内部管理的。应用程序与数据库的交互速度非常快,但应用程序代码相当复杂,这意味着很难维护。此外,由于原始 SQL 无处不在,因此很难水平扩展数据库 - 我们必须重新发明大多数 JPA 提供商已经做过的事情。
当前目标
目前,我们正在探索一种机制的选项,通过这种机制,这种分区可以在幕后发生——可能是由 JPA 提供者(我知道这不是 JPA 规范的一部分),这样我们就可以专注于应用程序,而底层框架/层负责解决可扩展性问题。
我查看了 openJPA Slice 和 EclipseLink。它们都提供跨主机的分区(分片)管理。我们当然需要那个。但是我们还需要在单个主机内进行分区管理。然而,如果有更好或更优雅的解决方案,或者有一个完全不同的角度来看待这个问题,我会很高兴知道这一点。
我将不胜感激您提供的任何见解。
谢谢。
普拉杰什
最佳答案
您是否考虑过使用 Postgres 的表分区?
http://www.postgresql.org/docs/9.1/static/ddl-partitioning.html
关于java - 表分区的抽象层 - JPA,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11617033/