SQL和Hibernate - 重复计算表行

时间:2014-12-15 10:33:43

标签: java sql hibernate

假设我有两个表,例如threadauthor,其中 的 thread

+------+--------+-...-+
| id   | author | ... |
+------+--------+-...-+

author

+----+-...-+
| id | ... |
+----+-...-+

其中thread.authorauthor.id上有外键。这是论坛项目的一小部分。 我正在运行一个使用Hibernate ORM访问数据库的Java应用程序。所以,我基本上有3层:逻辑层(Java类)< - >数据访问层(Hibernate)< - >数据库中。

现在,考虑这种情况:我经常需要为很多用户提供线程数。所以,基本上我认为我有这些不同的解决方案:

  1. 保持数据库原样并且每次调用DB上的get(Hibernate等效于SELECT COUNT(*) FROM thread WHERE author='some_id')。这似乎效率很低,因为它很多次访问数据库。
  2. 修改author表,添加threads_number之类的列。但是,这又提出了另一点:哪一层更新了这一列?数据库触发器(在不同的数据库之间看起来非常不可移植)或应用程序层(这很好,但同时又会导致不一致)?
  3. (物化)视图。这似乎是合理的,但我认为我有同样的问题第2点:哪一层更新视图并检查一致性?
  4. 什么是最佳选择?

1 个答案:

答案 0 :(得分:0)

第二种方式很难。你有一对多的关系,所以你应该在单个author.threads_number字段中存储多个线程ID,但这是非常糟糕的做法。 物化视图将帮助您和典型视图与第一种方式相同 - 您需要从数据库中多次选择数据。 总而言之,您确实需要多次获得数据,因此您需要多次接收数据。 您所能做的就是使用hibernate访问数据库。 Hibernate可以在不使用数据库连接的情况下从缓存中读取存储的数据,并且可以管理数据库连接池以实现最佳性能。