【问题标题】:Correct implementation of the Filter (Criteria) Design Pattern过滤器(标准)设计模式的正确实现
【发布时间】:2015-07-17 16:18:02
【问题描述】:

这里解释了设计模式: http://www.tutorialspoint.com/design_pattern/filter_pattern.htm

我正在开发一款与 Adob​​e Lightroom 或 ACDSee 非常相似但用途不同的软件。用户(摄影师)能够从他的硬盘中导入数千张图像(拥有超过 100k/200k 的图像并不奇怪)。

我们有一个侧面板,用户可以在其中创建自定义“过滤器”,其表达式如下:

Does contain the keyword: "car"
AND
Does not contain the keyword "woods"
AND
(
Camera model is "Nikon D300s"
OR
Camera model is "Canon 7D Mark II"
)
AND
NOT
Directory is "C:\today_pictures"

你可以从上面的例子中得到这个想法。

我们有一个存储所有图像信息的 SQLite 数据库。问题是,我们是否应该在第一次加载程序时将所有照片对象从数据库加载到内存中,并按照上面引用的网站中的说明实现 Criteria/Filter 设计模式,以便我们的 Criteria 类过滤对象或者更好地执行标准类实际上会生成一个最终执行的 SQL 查询,以便仅从数据库中检索需要的内容?

我们正在使用 C++ (QT) 开发程序。

【问题讨论】:

  • 您是说用户通常拥有最多 Nk 个项目,N 没有上限。为什么您认为从数据库加载所有项目然后使用过滤器可能更可取对定义明确的查询的解决方案?
  • 我想会有一个限制,也许是 500k...
  • 不,我只是在问正常的事情是将所有内容加载到内存中还是应该使用某种缓存?但我的问题实际上来自于在我提供的链接中看到过滤器/标准模式的实现......他们检查内存对象以返回结果集...... .
  • 我的背景是非常低级的编程,所以这对我来说并不清楚什么是最好的解决方案,我希望人们能指出想法以及这个实现可能有什么好的解决方案。

标签: c++ qt sqlite design-patterns design-principles


【解决方案1】:

TL;DR:它已经在 SQLITE3 中正确实现,看看花了多长时间。您将面临同样的负担。

从数据库中读取数据并将其再次存储在另一个数据结构中,这将是一个可怕的数据重复案例。使用数据库查询来实现用户给你的查询。让数据库执行查询。这就是数据库的用途。

通过重新实现约 50 万条记录的搜索/查询系统,您将自己重写大量的沼泽标准数据库。这将是一个几乎毫无意义的练习。 SQLITE3 非常经过良好测试,基本上是万无一失的。重新实现其功能的一小部分可靠性/弹性将花费您数千小时的工作。如果这不叫“重新发明轮子”,我不知道是什么。

该数据库还允许您非常轻松地实现前瞻/下拉菜单,以帮助用户编写查询。例如,当您输入“相机型号”时,用户可以选择自动完成或下拉菜单来选择一个或多个型号。

您支付了数据库的“价格”,如果这一切都浪费了,那将是一种耻辱。所以,使用它。它会给你很大的影响力,让你实现功能的速度比其他方式快两个数量级。

您链接到的模式只是一个模式。这并不意味着它是如何设计应用程序以在真实数据上执行的精确蓝图。最终,您将与并发性(运行以更新元数据的文件扫描线程)、索引、面对崩溃时的弹性等作斗争。最终,您将获得为您重新实现的大量 SQLITE特定的应用。 500k 元数据记录不算什么,如果你设计好你的查询翻译器并用适当的索引支持它,它会很好地工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多