ПБД (9) - Лекция №3 - Модели данных (продолжение)
Содержание
Продолжаем работать с нашим примером:
ODL
Для нашего примера
Кстати, ключи везде прописывать не обязательно, потому что по умолчанию всегда будет OID. И он будет назначаться всегда, даже если мы объявим ещё и свой ключ.
class Film(extent Films key(name, year)) { attribute string name; attribute integer year; attribute integer len; attribute enum Ftype {bw, color} type; relationship Studia stud inverse Studia::fs; relationship Set<Actor> acts inverse Actor::infs; -- пример метода. Считает актёров и возвращает noActors, если нету ни одного integer ActCount() raises(noActors); void FinYear(in integer year, out Set<Films>) raises(noFilms, badYear); }; class Studia(extent Studies) { attribute string sname; attribute Struct Addr { string city, string street } addr; relationship Set<Film> fs inverse Film::stud; }; class Actor(extent Actors key inn) { attribute string inn; attribute string fio; attribute List<string> edu; relationship Set<Film> infs inverse Film::acts; }; class MF extends Film(extent MFS) { attribute string drawer; }; class Drama extends Film (extent Dranas) { attribute Struct { Set<string> authors, string bname } book; };
Для примера с ВУЗом
class Vuz(extent Vs) { attribute string name; relationship Set<Kaf> Kafs inverse Kaf::vuzz; }; -- слабая сущность class Kaf(extent Ks key(kname, vuzz)) { attribute string kname; relationship Vuz vuzz inverse Vuz::Kafs; };
Про связи
Все связи строго бинарны - можно связать только два объекта. Чтобы связать больше объектов (например, три), надо делать так:
class Gr(extent ...) { attribute ... relationship Set<ADG> gin inverse ADG::g; }; class Dis(extent ...) { relationship Set<ADG> din inverse ADG::d; }; class Aud(extent ...) { relationship Set<ADG> in inverse ADG::a; }; -- этот класс содержит связи class ADG(extent edgs) { relationship Aud a inverse Aud::in; relationship Dis d inverse Dis::din; relationship Gr g inverse Gr::gin; };
Переход от объектной модели к реляционной модели
Когда это может понадобиться:
- при переходе из объектного проекта в реляционную реализацию;
- при необходимости создать реляционную проекцию в объектной БД.
Преобразования:
- класс с экземплярами атомарных атрибутов преобразуется в схему отношений с теми же самыми атрибутами;
- составные атрибуты преобразуются в ненормализованное отношение, которое после этого надо нормализовать во избежание аномалий;
- методы не преобразуются вообще, они теряются, так как в реляции методов нет;
- ключ преобразуется в ключ;
- если ключа не было, то вводится дополнительное поле, которое будет ключом;
- у структур поля преобразуются в отдельный атрибут;
- множества преобразуются в множества кортежей.
- Отношение М-М = отдельная таблица с ключами
- Отношение 1-М = FK на стороне М
Пример с нашим примером:
Films(name, year, len, type); Stusies(sname, city, street, sid); Actor(f, i ,o, edu, inn);
Объектно-реляционная модель данных
Это расширение реляционной модели. В основе лежит реляция - те же самые схемы отношений, экземпляры отношений, но добавляются некоторые возможности:
- составные атрибуты:
- структура;
- коллекция:
- список;
- массив;
- мультимножество;
- множество структур (вложенное отношение):
Actors(inn, fio, edu(year, Vuz));
- методы;
- методы экземпляров;
- методы классов;
- ссылки - теперь в качестве значения атрибута можно хранить ссылку на конкретный кортеж:
Studies(sname, addr, sid Films(name, year, len, type, stud(*(Studies)));
Для соблюдения стандарта SQL'99 связь 1:M создаётся добавлением в таблицу со стороны М ссылки на кортеж таблицы со стороны 1.
А связь М:М создаётся путём отдельной дополнительной таблицы, содержащей ссылки на соответствующие кортежи таблиц.
Сравнение объектной и объектно-реляционной модели
Объектная модель | Объектно-реляционная модель |
---|---|
класс → экстент объект |
схема отношения → отношение (таблица) кортеж |
методы | методы |
структуры, коллекции, множество структур (классы) |
структуры, коллекции, множество структур (схемы отношений или вложенные отношения) |
OID скрыт | OID может быть доступен |
1 класс - 1 экстент 1 интерфейс - N классов и N их экстентов |
1 схема отношений - N отношений (таблиц) |
обратной совместимости с реляционной моделью нет | обратно совместима с реляционной моделью |