ПБД (9) - Лекция №3 - Модели данных (продолжение): различия между версиями
(не показаны 3 промежуточные версии 3 участников) | |||
Строка 56: | Строка 56: | ||
}; | }; | ||
class MF | class MF extends Film(extent MFS) | ||
{ | { | ||
attribute string drawer; | attribute string drawer; | ||
}; | }; | ||
class Drama | class Drama extends Film (extent Dranas) | ||
{ | { | ||
attribute Struct | attribute Struct | ||
Строка 137: | Строка 137: | ||
Преобразования: | Преобразования: | ||
* класс с экземплярами атомарных атрибутов преобразуется в схему отношений с теми же самыми атрибутами | * класс с экземплярами атомарных атрибутов преобразуется в схему отношений с теми же самыми атрибутами; | ||
* составные атрибуты преобразуются в ненормализованное отношение, которое после этого надо нормализовать во избежание аномалий; | * составные атрибуты преобразуются в ненормализованное отношение, которое после этого надо нормализовать во избежание аномалий; | ||
* методы не преобразуются вообще, они теряются, так как в реляции методов нет; | * методы не преобразуются вообще, они теряются, так как в реляции методов нет; | ||
Строка 144: | Строка 144: | ||
* у структур поля преобразуются в отдельный атрибут; | * у структур поля преобразуются в отдельный атрибут; | ||
* множества преобразуются в множества кортежей. | * множества преобразуются в множества кортежей. | ||
* Отношение М-М = отдельная таблица с ключами | |||
* Отношение 1-М = FK на стороне М | |||
Пример с нашим примером: | Пример с нашим примером: | ||
Строка 149: | Строка 151: | ||
Films(<u>name, year</u>, len, type); | Films(<u>name, year</u>, len, type); | ||
Stusies(sname, city, street, <u>sid</u>); | Stusies(sname, city, street, <u>sid</u>); | ||
Actor(f, i ,o, edu, <u>inn</u>); | |||
== Объектно-реляционная модель данных == | == Объектно-реляционная модель данных == |
Текущая версия от 12:53, 2 ноября 2016
Продолжаем работать с нашим примером:
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 отношений (таблиц) |
обратной совместимости с реляционной моделью нет | обратно совместима с реляционной моделью |