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