过滤器(条件)设计模式的正确实现

Correct implementation of the Filter (Criteria) Design Pattern

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

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

我们有一个侧面板,用户可以在其中创建自定义 "filters" 表达式,例如:

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 设计模式,以便我们的条件 类 过滤对象或更好的做法是让条件 类 实际上生成一个 SQL 最终执行的查询,以便仅从数据库中检索所需的内容?

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

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

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

通过为约 50 万条记录重新实现 search/query 系统,您将自己重写大量的沼泽标准数据库。这将是一个毫无意义的练习。 SQLITE3 非常 经过充分测试,基本上是万无一失的。重新实现其功能的一小部分 and reliability/resiliency 将花费您数千小时的工作时间。如果那没有尖叫 "reinventing the wheel",我不知道什么会尖叫。

数据库还允许您非常轻松地实现 lookahead/dropdowns 以帮助用户编写查询。例如,当您输入 "camera model is" 时,用户可以选择自动完成或下拉至 select 一个或多个模型。

你花了 "price" 一个数据库的钱,要是全部浪费掉就太可惜了。所以,使用它。它会给你很大的影响力,并允许你比其他方式更快地实现功能两个数量级。

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