ПБД (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 extend S Film(extent MFS)
{
attribute string drawer;
};
class Drama extend S 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;
};
Переход от объектной модели к реляционной модели
Когда это может понадобиться:
- при переходе из объектного проекта в реляционную реализацию;
- при необходимости создать реляционную проекцию в объектной БД.
Преобразования:
- класс с экземплярами атомарных атрибутов преобразуется в схему отношений с теми же самыми атрибутами);
- составные атрибуты преобразуются в ненормализованное отношение, которое после этого надо нормализовать во избежание аномалий;
- методы не преобразуются вообще, они теряются, так как в реляции методов нет;
- ключ преобразуется в ключ;
- если ключа не было, то вводится дополнительное поле, которое будет ключом;
- у структур поля преобразуются в отдельный атрибут;
- множества преобразуются в множества кортежей.
Пример с нашим примером:
Films(name, year, len, type); Stusies(sname, city, street, sid);
Объектно-реляционная модель данных
Это расширение реляционной модели. В основе лежит реляция - те же самые схемы отношений, экземпляры отношений, но добавляются некоторые возможности:
- составные атрибуты:
- структура;
- коллекция:
- список;
- массив;
- мультимножество;
- множество структур (вложенное отношение):
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 отношений (таблиц) |
обратной совместимости с реляционной моделью нет | обратно совместима с реляционной моделью |