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



         

Проблема объектно-табличного отображения - часть 2


Однако для связывания этих таблиц потребуется наличие у каждой из них независимого первичного ключа (такого, значения которого реально не хранится в сущности объекта), чтобы у каждого порожденного класса могла иметься связь по внешнему ключу с таблицей, соответствующей его суперклассу. Причина этого понятна: объект GraduateStudent, поскольку у него имеется связь IS-A с объектами Student и Person, является коллекцией трех наборов состояния, и ко времени создания объекта этого типа различие между этими классами в значительной степени теряется. Например, в Java и .NET объект представляет собой участок памяти, в котором сохраняются поля экземпляра, определенные для класса и всех суперклассов, а также таблица методов, определяемых той же иерархией. Это означает, что при расспрашивании конкретного экземпляра на реляционном уровне для сборки состояния объекта в рабочую память объектной программы потребуются, по меньшей мере, три соединения.

На самом деле, дело обстоит еще хуже. Если иерархия объектов продолжает расти, включая, например, классы Professor, Staff, Undergrad (наследует от класса Student) и всю иерархию AdjunctEmployees (наследуемую от Staff), и программа хочет найти всех людей по фамилии Smith, то соединения должны быть выполнены для всех порожденных классов системы, поскольку семантика «найти всех людей» означает, что запрос должен произвести поиск данных в таблице PERSON, а затем выполнить набор дорогостоящих операций соединения для импорта из базы данных оставшихся данных. В этих операциях должны участвовать таблицы PROFESSOR, UNDERGRAD, ADJUCTEMPLOYEE, STAFF и все другие таблицы, соответствующие классам, которые порождены от PERSON. Если учесть, что запросы с соединениями относятся к числу наиболее дорогостоящих запросов, поддерживаемых РСУБД, то становится очевидной невозможность быстрого выполнения требуемых действий.

В результате разработчики обычно применяют один из двух других подходов, являющихся на вид более сложными, но и более эффективными при работе с реляционным хранилищем.


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