建议数据库查询API

时间:2012-06-12 03:39:25

标签: design-patterns search usability api-design query-by-example

使用专有的Bioinformatics软件操作域对象,我必须增强API,以便外部各方可以访问存储在内部数据库中的(CRUD)数据。

数据按类型(如分子,寡核苷酸和酶)分组,每个数据中都可以存在可嵌套的子集(分子::蛋白质,分子:: dna等)。

由于每种数据类型都有不同的属性,我们使用格式化的查询字符串(类似于广泛使用的entrez格式)来指定搜索条件。代码示例如下:

IMoleculePersistenceService svc = PersistenceFactory::GetMoleculeService();

// IMoleculePersistenceService::search( <search-string>, <subset> );
IMolecule[] searchResult = svc.search( "Foo[Name] OR 128[Length]", "molecule::protein" );


我的问题是:

假设用户具有相应的领域知识,以了解与生物学相关的层次结构。 让搜索功能接受prototype对象而不是格式化字符串会更好吗?

IMoleculePersistenceService svc = PersistenceFactory::GetMoleculeService();

IMoleculeTemplate searchPrototype = svc.GetSearchPrototype();
searchPrototype.SetName( "Foo" );
searchPrototype.SetLength( 128 );

IMolecule[] searchResult = svc.search( searchPrototype, "molecule::protein" );
IMolecule[] searchResult2 = svc.search( svc.GetSearchPrototype( <parameters> ), "molecule::protein" );


优点:
- 更容易想象/理解
- 如果prototype可以自动序列化为(格式化)字符串,则与查询字符串兼容。
缺点:
- 固定标准组合时不灵活(AND,OR)。

1 个答案:

答案 0 :(得分:0)

服务应该只接受“原型”。将字符串解析为原型是其自身的特征,并不直接属于该服务。我通过例如推广基于原型的原型。首先在HowTo中展示它的示例,并在稍后提及解析功能。

在C#land中,有IQueryable界面 - 看看answers to this question。原型非常类似于Expression s,但这对于手头的需求来说可能过于通用。

此外,返回数组可能不是最佳选择,因为这会将实现修复为使用数组。再次在C#中,有IEnumerable,但我希望看到一些简单的SearchResult类提供生成/返回结果数组的功能,因此允许您进行内部更改和优化。