как разработать запрос для не-SQL базы данных - PullRequest
2 голосов
/ 04 мая 2010

Может ли кто-нибудь дать ссылку на шаблон проектирования интерфейса запроса базы данных не в формате SQL?

Для базы данных на основе sql запрос может быть выполнен путем объединения токена запроса. но для не-SQL, как разработать запрос, учитывая, что запрос может быть очень сложным.

EDIT:

Я использую db4o для хранения некоторых объектов, мне может потребоваться выполнить запрос в соответствии с определенным идентификатором, диапазоном времени или их комбинацией.

Как разработать метод запроса?

public IEnumerable<Foo> GetFoos(int id);
public IEnumerable<Foo> GetFoos(int id, TimeRange range);

Чтобы создать много перегрузок, кажется глупым, что, если нужен новый запрос?

Ответы [ 2 ]

3 голосов
/ 04 мая 2010

В C # определенно лучше использовать Linq. Собственные запросы часто не оптимизируются, что приводит к тому, что db4o гидратирует все объекты и фактически вызывает лямбда-выражение для экземпляра объекта. Это не что иное, как автоматический откат к linq-to-objects, и он чертовски медленный по сравнению. Простое увлажнение 60 000 наших типичных объектов занимает несколько секунд.

Подсказка : Никогда нельзя вызывать точку останова в лямбда-выражении.

Даже при использовании Db4oTool.exe для оптимизации собственных запросов в качестве шага после сборки даже простые запросы приводят к проблемам при использовании свойств или авто-свойств в объектах домена.

Поставщик linq всегда давал лучшие результаты для меня. У него самый лаконичный синтаксис, и его оптимизации работают. Также поставщик linq очень полон, только он может обращаться к linq-to-objects чаще, чем вы ожидаете.

Также важно, чтобы у провайдера linq были определенные dll в папке проекта. То, что это, зависит от версии немного. Если вы используете сборки> = 14204 , убедитесь, что Mono.Reflection.dll находится в папке вашего приложения.

Для более старых версий должно присутствовать все следующее:

Db4obects.Db4o.Instrumentation.dll
Db4objects.Db4o.NativeQueries.dll
Mono.Cecil.dll
Cecil.FlowAnalysis.dll

Обратите внимание, что для собственных запросов они все еще требуются даже в более новых сборках.

1 голос
/ 04 мая 2010

Похоже, db4o использует собственные запросы, которые Versant вызывает Собственные запросы (примечание: для .Net и собственных запросов Java существует отдельный синтаксис) Что-то вроде:

IObjectContainer container = Database();
container.Query(delegate(Foo foo) {
    return foo.id == id;
});

container.Query(delegate(Foo foo) {
        return foo.id == id;
    },
    delegate(Foo foo) {
        return range.IsIn(foo.time);
    });
...