Идентификация объектов в ООБД
Для идентификации объектов в объектно-ориентированных моделях данных применяется автоматически генерируемый уникальный идентификатор (OID – Object Identifier), который назначается каждому объекту в момент его создания. Объекты в ООБД могут и не иметь OID, если они не представляют собой некоторой сущности и могут использоваться разными объектами, например числа и другие простые типы данных. Кроме OID для идентификации объектов может также применяться традиционный подход с использованием ключевых атрибутов. OID обладает следующими свойствами:
· Генерируется системой;
· Уникально обозначает реальный объект и не зависит от значений его атрибутов;
· Инвариантен. Его нельзя изменить во время всего жизненного цикла программы. После создания объекта его OID не может быть использован повторно ни для какого другого объекта, даже после его удаления.
OID также применяются для связывания объектов и обеспечения ссылочной целостности. Бинарные связи чаще всего реализуются на основе инверсных ссылок, т.е. включения OID объектов друг в друга. Инвариантность OID упрощает контроль целостности, исключая каскадное обновление связанных объектов.
Применение OID дает неоспоримые преимущества над реляционной системой, где идентификация объекта производится по значению ключа, зачастую надуманного, и который, к тому же, может меняться. Например, в любой момент времени можно удалить некоторый объект и значение его ключа использовать для другого объекта. Также можно отметить следующие достоинства применения OID:
· Эффективность и быстрота. OID обычно представляет собой указатель на фактический адрес объекта в памяти и поэтому доступ к нему занимает очень мало времени;
· Независимость от данных. Один и тот же объект может неоднократно менять свое содержание, но при этом он останется одним и тем же объектом;
· Невозможность изменения пользователем.
Но и в ООМД все еще остается возможность создания двух идентичных копий некоторого объекта, различающихся только OID, и поэтому применение ключевых атрибутов для дополнительной идентификации объектов оправдано.
Инкапсуляция данных
В противоположность реляционным БД, где операции над данными (вставка, удаление, модификация), являются общими и могут быть применены к любым объектам (таблицам) БД, объектно-ориентированные БД обеспечивают инкапсуляцию данных, т.е. ограничивают область видимости данных, принадлежащих объекту (и, следовательно, доступ к ним). Доступ к таким данным представляется только операциям этого объекта. В идеале для каждого атрибута объекта должна быть определена операция доступа (get). Но требования полной инкапсуляции приводят к невозможности выполнения параллельных транзакций и быстрого поиска на основе индексов. Инкапсуляция также приводит к тому, что обеспечение целостности становится задачей каждого объекта в отдельности. Лишь ссылочная целостность может контролироваться системой снаружи. Поэтому требования инкапсуляции объектов в ООБД выполняются только на уровне пользователей, а не системы в целом.
Инкапсулированными являются не только данные, но и операции. Только часть операций является доступной снаружи и предоставляет интерфейс объекта. Операции в ООБД состоят из двух частей: подписи (интерфейса), содержащего имя операции и список аргументов, и тела (метода), содержащего собственно реализацию операции. Такой подход выполняет требование независимости программ и операций, поскольку позволяет модифицировать операции объектов, не затрагивая внешние программы, имеющие доступ к этим операциям.
Наследование
Важнейшей базовой концепцией объектно-ориентированного программирования является способность классов к наследованию атрибутов и операций от базового класса, называемого суперклассом. Такая способность к порождению классов от уже существующих делает возможным поступательное наращивание сложности программы и определяет легкость модификации. Процесс образования суперкласса называется обобщением, а процесс образования подкласса – специализацией. Подкласс наследует все основные свойства суперкласса и дополнительно определяет свои собственные. Наследование существенно сокращает избыточность данных, так как общие свойства могут быть легко перенесены в суперклассы. В свою очередь подклассы могут переопределять свойства суперклассов. Возможность переопределения является важной характеристикой наследования, поскольку позволяет легко управлять отдельными классами с минимальным влиянием на остальную часть системы. Переопределение позволяет повторно использовать имя операции в нескольких классах, что дает возможность определять одно и тоже имя для одной и той же операции независимо от ее типа. Конкретный тип операции определяется из контекста при выполнении программы.
Полиморфизм
Переопределение (перегрузка) является частным случаем полиморфизма и означает способность одного и того же программного кода работать с разнотипными данными. Иначе говоря, для разных классов можно определить функции с одинаковыми именами, а вызов конкретной функции будет определяться типом данных либо из контекста. Полиморфизм позволяет обеспечить динамическое (позднее) связывание объектов, когда тип объекта становиться известным не в процессе написания программы, а во время ее выполнения.