【问题标题】:SQL Joins vs Java code?SQL 连接与 Java 代码?
【发布时间】:2014-10-25 13:42:28
【问题描述】:

我有这样的查询

Select Folder.name from FROM FolderTable,ValidFolder, ValidFolderGroup, ValidUser,
ValidLocation, ValidDepartment where  ValidUser.LocationCode *= ValidLocation.LocationCode         
    and ValidUser.DepartmentCode *= ValidDepartment.DepartmentCode and Folder.IssueUser =         
    ValidUser.UserId and ValidFolder.FolderType = Folder.FolderType and         
    ValidFolderGroup.FolderGroupCode = ValidFolder.FolderGroupCode and         
    ValidFolderGroup.GroupTypeCode = 13 and (ValidUser.UserId='User' OR             
    ValidUser.ManagerId='User')  and ValidFolderGroup.GroupTypeCode = 13 and             
    Folder.IssueUser = 'User' 

现在这里所有以Valid开头的表都是缓存表,所以这些表已经包含数据了。

假设如果有人使用 JOOQHibernate 哪个是最佳选择

  1. 对所有联接使用上述查询?
  2. 或者使用Java代码来满足要求而不是加入,因为作为用户使用HibernateJOOQ它已经有Java类的表和Valid表已经有所有的数据?

【问题讨论】:

  • 您的问题并不完全清楚。 “使用 Java”是什么意思?
  • 我的意思是说 Java 代码是因为有效表已经缓存了数据,所以这些表 java 类的实例已经包含了该表的所有数据,所以我可以先将有效表添加到条件中从文件夹表中获取所有记录,然后在 Java for 循环中我可以满足条件并创建一个列表
  • 您使用什么作为缓存机制?如果您只是将整个Valid 表加载到内存中,我几乎可以向您保证这是一个糟糕的解决方案。对于任何问题。
  • 有效表只有很少的记录,比如只有 10-20 条记录
  • 你怎么知道的?您有什么机制来执行此操作?

标签: java sql hibernate jooq


【解决方案1】:

听说过观点吗?看看他们,你会感到惊讶。
除此之外,不可能说出您应该做什么,没有“最佳”,而且您提供的信息太少,甚至无法对您的具体要求做出有根据的猜测。

但是,我不会在查询中对数据库 ID 之类的东西进行硬编码,这些内容最终会出现在任何程序中,因为太容易在(不久的)将来引起问题。

【讨论】:

    【解决方案2】:

    好的,你可能不会喜欢这个答案,但最好的方法是不要保留Valid“缓存”。

    我认为最好的解决方案是使用jOOQ(如果您更喜欢 DSL)或 Hibernate(如果您更喜欢 OR 映射)并每次查询数据库,并始终使用 DAO 模式。

    jOOQ 和 Hibernate 的家伙几乎肯定比你更擅长 SQL。我们在非常大的企业项目中使用了jOOQ 和 Hibernate,它们都表现出色。特别是像BoneCP 这样的良好连接池。如果在您运行该设置并运行良好后,但仍然认为您可能有性能问题,您可以随时添加缓存(如 EhCache)。

    最终,我对您的软件做了很多假设,即

    1. 工作的人比你多,而且
    2. 必须维护。如果这些假设都不成立,那么您可以放心地忽略此答案。

    【讨论】:

    • hanks 但我无法删除 Valid table concept 它的应用基础,将来我们可以删除但不是现在
    • 我没有说删除它。我说“不要将它存储在内存中,在需要时从数据库中获取它”或者如果数据是静态且不可变的,则不要将其存储在数据库中。
    【解决方案3】:

    一般答案:

    现代数据库非常擅长优化您的查询并为您选择最佳的执行计划。鉴于您使用 *= 的外连接表示法,您显然使用的是 SQL Server,所以这是一个非常好的数据库。

    即使您的应用程序内存中已经有很多 “有效” 数据,您的数据库也可能已经在缓冲区缓存中拥有相同的数据,因此数据库不需要再次点击磁盘以获取查询中的各种连接。

    事实上,根据您数据的性质,数据库甚至可能会评估您的某些联接是不需要的 (if you have the right meta data, like constraints)。

    具体答案:

    在您的特定情况下,它看起来好像您确实可以自己剥离大部分查询,并使用应用程序的 “有效”中的搜索条件仅查询 Folder em>缓存。我是说它看起来很像,因为我不完全理解这些连接背后的业务逻辑,以及它们是否都在建模 1:1 关系,或者删除它们是否会改变语义查询。

    因此,从技术上讲,您可以删除连接,但如果您想保持安全,请在迁移到 jOOQ 或 Hibernate 时保持原样。

    备选方案 3:

    当然,当您将 "Valid" 内容加载到记忆。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 2018-01-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多