我们有2个表 - 概述和细节。 “概述”中可能有数百万行,“概览”的每一行在“详细信息”中可能有数百万行与之关联。外键details.overview_id是指overview.id。大多数查询都是一般形式
SELECT * FROM details WHERE overview_id = xxx AND details.id > yyy AND details.id < zzz;
如果我们有一个表格来查看详细信息,那么查询将会太慢(尽管对详细信息的查询是几乎总是在主键上。)
更多关于数据库活动的性质:概述上的INSERT和UPDATE很少发生。对细节的INSERT快速发生,而同一桌上的UPDATE几乎从未发生过,有时会发生批量删除。
过去,我们使用原始SQL将表“详细信息”分区为“概述”中的每一行。 (实际上,我们实际上没有进行分区,而是基于模板创建了新表。这些表没有任何名为overview_id的列(节省存储空间),而是我们有一个单独的表来完成overview.id和特定分区表的表名。)因此,正如您所理解的那样,必须在概览中插入新行时动态生成分区,并在从概览中删除行时删除分区。所有这些都在应用程序内部进行管理。应用程序 - 数据库交互速度非常快,但应用程序代码相当复杂,这意味着它很难维护。此外,随着原始SQL遍布各地,很难横向扩展数据库 - 我们必须重新发明大多数JPA提供商已经完成的工作。
目前我们正在探索一种机制的选项,通过这种机制可以在场景后面发生这种分区 - 可能是由JPA提供商(我知道这不是JPA规范的一部分),因此我们可以专注于应用程序底层框架/层负责可扩展性问题。
我查看了openJPA Slice和EclipseLink。它们都提供跨主机的分区(分片)管理。我们当然需要那个。但我们还需要在单个主机中进行分区管理。但是,如果有一个更好或更优雅的解决方案,或者如果有一个完全不同的角度来看待这个,我会很高兴知道这一点。
我将非常感谢您提供的任何见解。
感谢。
Prajesh
答案 0 :(得分:2)
您是否考虑过使用Postgres的表格分区?
http://www.postgresql.org/docs/9.1/static/ddl-partitioning.html
答案 1 :(得分:0)
感谢大家的评论/答案。我们决定坚持我们已经拥有的东西(参见“我们已经拥有的东西”一节),稍加修改。