【问题标题】:To sort locally or to requery?本地排序还是重新查询?
【发布时间】:2011-10-22 11:07:00
【问题描述】:

我正在开发一个 java 应用程序,它将以图形方式描述和组织数百个对象。这些对象中的每一个都是从 SQL 数据库中加载的,以便在该程序中使用。

用户对这些数据进行排序,为了获得有关数据集的信息,我(作为程序员)遇到了三种不同的方法来实现这一点:

  1. 使用单独的 SQL 查询将预先排序的数据返回给程序。
  2. 在本地使用排序算法对整个数据集进行排序。
  3. 使用本地 SQLite 数据库将整个数据集复制到,然后查询本地数据库进行排序。

哪个更可取,或者还有其他我可能错过的解决方案吗?

【问题讨论】:

  • 还有什么问题?
  • 我不确定这里的问题是什么,需要澄清一下吗?如果您只处理数百个对象并且将它们保存在内存中,那么您为什么还要为了排序而费心重新查询呢?特别是如果它不是一个网络应用程序,你可以将数据保存在内存中。
  • 我在写问题时不小心点击了提交=p
  • 用户总是按相同的字段对这些数据进行排序,或者可能按不同的字段排序?
  • 另外,用户可以随时请求不同的排序。

标签: java sql algorithm swing sorting


【解决方案1】:

一般来说,所有解决方案都可能有效,这取决于具体要求 - 我的想法:

1.使用单独的 SQL 查询将预先排序的数据返回给程序

如果用户预先定义排序标准,效果会很好。如果她想在数据检索后采取措施(导致#2)怎么办?为每个请求定义默认排序或根据某些标准(如用户角色)影响排序顺序的参数可能是有意义的。

2。在本地使用排序算法对整个数据集进行排序

如前所述,您可能需要 #1 和 #2 的组合。

3。使用本地 SQLite 数据库将整个数据集复制到,然后查询本地数据库进行排序

完全不同的策略,你必须关心的几件事:

  1. 数据同步
  2. 安全;在大型企业工作,我知道某些安全人员(例如审计员)在谈论本地数据复制时会发疯
  3. 离线功能(优势)
  4. 本地存储

个人选择:我会选择 #1 和 #2 的组合。此外,我会尝试以支持滚动的方式定义界面(例如“检索行 #20-100”)。

不是一个明确的答案,但我的意见基于你提供的事实......

【讨论】:

  • @Peaches491:谢谢。顺便说一句:我不知道您是否要直接访问数据库(JDBC)......在两者之间有一个中间协议(如 JSON)可能是有意义的。直接客户端到数据库的连接在全球分布式解决方案中无法扩展(JDBC 很健谈)...
  • 你说的很对。我目前只使用JDBC,并且发现查询有时很慢。 JSON的目的是什么?
  • @Peaches491:鉴于关系数据库协议很健谈,在两者之间引入一层是有意义的。 JSON 只是一个例子。在全球(WAN、互联网)解决方案中,有一个中间整合数据库访问是有意义的。例如。对ResultSet.next() 的每次调用都需要从客户端到数据库的往返,因此引入通过 HTTP 提供整合数据的应用程序服务器(如 Tomcat)应该可以减少延迟(客户端 > 应用程序服务器 > 数据库)。如果这已经是一个问题,您应该调查这种解决方案(还剩 45 个字符,所以我必须关闭 :-)
【解决方案2】:

如果可以的话,几乎总是在数据库中排序。它几乎总是比首先将未排序的数据加载到程序中然后在代码中手动排序要快。

这样做的原因是因为数据库引擎被优化为只做这种事情(双关语不是故意的)。它们被设计成在检索数据、过滤数据和排序数据方面速度惊人。它不仅在运行时间方面会更快,而且通常也会显着加快编码速度。

切勿出于排序数据的目的而执行 #3。据我所知,这只是引入了不必要的开销和复杂性,没有任何收获。

【讨论】:

  • 通常是的,但是对于慢速链接上的小数据集,答案可能是在本地排序。 OP 应该真正测试不同的可能解决方案,看看是否有任何真正的区别。
  • @rossum:确实如此,因此“几乎总是”。对于大多数应用程序来说,这些情况非常罕见。但是,是的,应该注意这一点。
【解决方案3】:

理想情况下,您只需查询数据库一次,然后将对象缓存在内存中。您可以使用默认(或动态配置)排序构造初始查询,然后在内存中对集合进行排序。

不过,还有其他因素需要考虑。如果通过网络访问数据库,那么您确实应该在本地缓存对象。如果您最终缓存了对象,则必须确保缓存和数据库的状态保持同步。

【讨论】:

    【解决方案4】:

    如果您的结果集只有几百个对象,那么您可以从应用自己的排序算法中获益良多。为了加快速度,请根据您的默认值对您从数据库中的第一次读取进行排序。

    【讨论】:

      【解决方案5】:

      我觉得 SQLite 方法会是更好的解决方案。

      • 编写自己的算法可能不如 SQLite 提供的那么好。

      • 与 SQLlite 相比,缓存不够好。

      【讨论】:

        猜你喜欢
        • 2011-04-01
        • 1970-01-01
        • 2015-10-26
        • 1970-01-01
        • 1970-01-01
        • 2010-10-30
        • 2019-03-03
        • 2018-08-06
        • 1970-01-01
        相关资源
        最近更新 更多