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



         

Проблема частичных объектов и парадокс времени загрузки - часть 2


В первом запросе выбирается необходимая сводная информация и идентификатор (в следующем запросе имя и фамилия не могут идентифицировать конкретного человека), а во втором запросе выбирается оставшаяся информация о запрашиваемом человеке. В действительности, большинство экспертов SQL остерегается использовать метасимвол «*», предпочитая явно именовать в запросе каждый столбец. Это делается по соображениям как производительности, так и удобства сопровождения – производительности, поскольку в этом случае РСУБД будет лучше оптимизировать запрос, удобства сопровождения, поскольку в этом случае будет меньше шансов получить избыточные столбцы, если DBA или разработчики изменять или произведут рефакторинг соответствующей таблицы. Возможность получения части таблицы (хотя все еще в реляционной форме, которая важна для обеспечения упоминавшейся ранее замкнутости) является существенной для упомянутой оптимизации – для большинства запросов требуется только часть всего отношения.

Это представляет проблему для большинства, если не для всех, систем ОР-отображения: целью любой такой системы является обеспечение разработчику возможности видеть «объекты и ничего, кроме объектов», но, тем не менее, слой ОР-отображения не позволяет указать, как будут использоваться объекты, полученные при выполнении запроса. Например, вполне правдоподобно, что большинство разработчиков захочет написать что-то вроде этого:

Person[] all = QueryManager.execute(...);

Person selected = DisplayPersonsForSelection(all);

DisplayPersonData(selected);

Другими словами, это означает, что после того, как из массива людей выбран конкретный человек, никаких дополнительных действий по выборке данных больше делать не надо – в конце концов, требуемый объект имеется, а больше ничего и не нужно.

Здесь проблема состоит в том, что данные, которые должны отображаться в первом вызове Display...(), не являются полными данными о людях. Здесь мы сталкиваемся с тем, что в объектно-ориентированной системе, написанной на C# или Java, невозможно возвращать «части» объекта – объект есть объект, и если объект Person состоит из 12 полей, то в любом таком возвращаемом объекте будут представлены все 12 полей.


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