【发布时间】:2013-08-13 16:31:38
【问题描述】:
在了解更多有关 DDD 模式的个人游戏项目的上下文中,我缺少一个用于过滤器的 Specification 对象。
环顾四周,似乎一切(如 LinQ)都面向 SQL 数据库。然而,对于许多 NoSQL 数据库,大多数查询,即使只是“从表中选择 *”也需要预定义的视图。然而,如果存储库正在映射 Web 服务,那么查询的类型也会更加严格。
考虑到非 SQL 数据库的限制,规范模式是否存在变体?我觉得这需要使用继承和静态声明来支持不同类型的持久性后端。
我应该如何在我的存储库中结合“排序”和“过滤”?例如,考虑 Order 项目列表的存储库。
(Query)findAllSortedByDate;
(Query)findAllSortedByName;
(Query)findAllSortedByQuantity;
因此,当以表格显示时,这些是不同类型的排序。由于我可能会处理大量结果,因此我从未考虑在视图或视图模型中进行排序或过滤。最初我想到了一个 Proyection 类,它可以根据用户操作从存储库中选择正确的查询。但是,如果我想将不同的排序策略与不同的过滤器结合起来,这将无法正常工作。
显然我需要某种类型的“规范”对象,但我不确定是否:
- 我应该将它们用于我的存储库,让它们更智能吗?或者我应该将它们用于我的视图模型?
- 如何正确限制我的规范对象以获得良好的多语言持久性?
最初我考虑将 Repository 用作 collection-like interface 来执行任何查询,但现在我注意到 view model 也可能表现为“有状态”集合-like 接口,而前者是“无状态”的类集合接口。
- 总的来说,我应该尝试在我的存储库中保留任何类型的排序/过滤吗?如果所有查询结果都可以加载到内存中,这样做似乎会增加不必要的复杂性。
更新: 为了增加这个问题的趣味性,还要考虑虽然 NoSQL 视图可以过滤和排序,但全文搜索可能需要外部索引引擎,例如 Lucene 或 SQLite-FTS,只为必须排序的查询提供实体的唯一标识并再次过滤。
【问题讨论】:
标签: design-patterns nosql repository domain-driven-design polyglot-persistance