Классика баз данных - статьи



         

Проблема механизма выборки данных


Пусть теперь интересующая нас сущность хранится в базе данных. Каким образом можно ее выбрать? В чистом объектно-ориентированном подходе для выборки следовало бы использовать объектный подход, в котором для идентификации объекта(ов) используется синтаксис в стиле конструктора, но, к сожалению, синтаксис конструкторов не является настолько общим, чтобы обеспечить необходимую гибкость. В частности, в нем отсутствует возможность инициализации коллекции объектов, а часто требуются именно запросы, возвращающие коллекции, а не одиночные сущности. (Несколько обращений к базе данных для выборки требуемых сущностей-членов коллекции обычно считаются слишком расточительными по отношению и ко времени задержки, и к пропускной способности, чтобы этот вариант можно было полагать разумной альтернативой. Подробности см. в разд. «Парадокс загрузки».) В результате обычно применяются подходы Query-By-Example (QBE), Query-By-API (QBA) или Query-By-Language (QBL)

Подход QBE характеризуется тем, что заполняется шаблон объекта того объектного типа, к которому направлен поиск. В поля шаблона объекта заносятся значения, используемые для фильтрации значений в процессе выполнения запроса. Например, если задается запрос к таблице объектов Person для выборки людей по фамилии Smith, то этот запрос при применении подхода QBE будет выглядеть примерно так:

Person p = new Person(); // assumes all fields are set to null by default

p.LastName = "Smith";

ObjectCollection oc = QueryExecutor.execute(p);

Проблема подхода QBE очевидна: он прекрасно подходит для простых запросов, но не является достаточно выразительным для поддержки более сложного стиля запросов, который часто требуется – «найти всех людей по фамилии Smith или Cromwell», «найти всех людей, фамилией которых не является Smith» и т.д. Хотя в принципе можно расширить подход QBE так, чтобы он справлялся с такими (и более сложными) запросами, это, безусловно, приведет к существенному усложнению API.


Содержание  Назад  Вперед