Реляционная модель

пятница, сент. 26, 2025 | 4 минуты чтения

Реляционная модель

Реляционная модель

  • Реляционная алгебра
  • Реляционное исчисление

Основан на реляционной алгебре: ISBL

Эдгар Франк «Тед» Кодд и Кристофер Дейт Эдгар Кодд (1923–2003) — британский учёный, работы которого заложили основы теории реляционных баз данных. Он создал реляционную модель данных, работая в компании IBM. Кристофер Дейт дал наиболее распространённую трактовку реляционной модели данных. Согласно его мнению, модель состоит из трёх частей: структурной, манипуляционной и целостной.

Типы операций

  • Теоретико-множественные
    • UNION, INTERSECT, etc…
  • Специальные реляционные

Выборка (унарная операция)

Применяется к одному отношению и определяет результирующее отношение, которое содержит только те кортежи из исходного отношения, которые удовлетворяют заданному условию (предикату). $\sigma$ предикат $(R)$ {sql}SELECT * FROM "Персоны" WHERE "Возраст" >= 34

Проекция (унарная операция).

Применяется к одному отношнеию и определяет новое отношение, содержащее вертикальное подномжество исходного отношения, создаваемое посредством извлечения значений указанных атрибутов и исключения из результата строк-дубликатов. $Па_1,…,a_n(R)$ {sql}SELECT "Возраст", "ВЕС" FROM "Персоны"

Объединение.

Объединение двух отношений $R$ и $S$ определяет новое отношение, которое включает все кортежи, содержащиеся только в $R$, все кортежи, содержащиеся только в $S$ и кортежи, содержащиеся одновременно в $R$ и в $S$ с исключением дубликатов. $R$ и $S$ должны быть совместимы по объединению, то есть состоять из одинакового количества атрибутов и каждая пара соответствующих атрибутов должна иметь одинаковый домен. Для совместимости можно предварительно применить проекцию. Имена атрибутов могут не совпадать - главное, чтобы совпадали домены. $R \cup S$

{sql}SELECT * FROM "Персоны" UNION SELECT * FROM "Персоны"

Пересечение

Операция пересечения определяет отношение, которое содержит кортежи, присутствующие как в отношении $R$, так и в отношении $S$. Отношения $R$ и $S$ должны быть совместимы по объединению. $R \cup S$

Разность

Разность двух отношений $R$ и $S$ состоит из кортежей, которые имеются в отношении $R$, но отсутствуют в отношении $S$. Отношения $R$ и $S$ должны быть совместимы по объединению. $R-S$

Произведение

Декартово произведение. Операция декартова произведения определяет новое отношение, которое является результатом конкатенации (сцепления) каждого кортежа из отношения $R$ с каждым кортежем из отношения $S$. $R \times S$. В чистом виде применяется редко, но служит основой для построения соединений.

Деление

Определяет отношение, состоящее из множества кортежей отношения $R$, которые определены на атрибуте $С$, соответствующем комбинации всех кортежей отношения $S$, где $C$ - множество атрибутов, имеющихся в отношении $R$, но отсутствующих в отношении $S$.

Соединение

  • Тета-соединение. Определяет отношение, которое содержит кортежи из декартова произведения отношений $R$ и $S$, удовлетворяющие предикату $F$. Где предикат $F$ имеет вид $R_{ai} \Theta S_{bi}$, гдо вместо тета может быть указана одна из операций сравнения ($<$, $<=$ и т.Д.). $R \blacktriangleright FS$

  • Если используются только сравнения по равенству, то такое соединение называется соединением по эквивалентности.

  • Естественное соединение - соединение по эквивалентности двух отношений, выполненное по всем общим атрибутам, из результатов которого исключается по одному экземпляру каждого общего атрибута. $R><S$

Критика Дейта

Избыточность

  • достаточно всего лишь пяти
  • пересечение, соединение, деление выводятся

Недостаточность

  • переименование атрибутов
  • вычисление атрибутов
  • агрегирующие функции (SUM, AVG)
  • присваивание результатов временным отношениям

Синтаксический порядок SELECT

… Выбор типа

  • TIMESTAMPTZ
    • Если важны события и их последовательность
      • логи, аудиты
    • при запросе смотрит на клиентскую тайм-зону
    • не хранит тайм-зоны
    • постоянно конвертирует
  • TIMESTAMP
    • даты из прошлого, для которого не важен часовой пояс

Пусть сервер на -3 часа, я на +3 часа, Есть разные клиенты (проги) Вот открыли 3 разных клиента. Возвращаем текущее время на каждой из них

INSERT

[ WITH [ RECURSIVE ] _with_query_ [, ...] ]
INSERT INTO _table_name_ [ AS _alias_ ] [ ( _column_name_ [, ...] ) ]
    [ OVERRIDING { SYSTEM | USER } VALUE ]
    { DEFAULT VALUES | VALUES ( { _expression_ | DEFAULT } [, ...] ) [, ...] | _query_ }
    [ ON CONFLICT [ _conflict_target_ ] _conflict_action_ ]
    [ RETURNING [ WITH ( { OLD | NEW } AS _output_alias_ [, ...] ) ]
                { * | _output_expression_ [ [ AS ] _output_name_ ] } [, ...] ]

where _conflict_target_ can be one of:

    ( { _index_column_name_ | ( _index_expression_ ) } [ COLLATE _collation_ ] [ _opclass_ ] [, ...] ) [ WHERE _index_predicate_ ]
    ON CONSTRAINT _constraint_name_

and _conflict_action_ is one of:

    DO NOTHING
    DO UPDATE SET { _column_name_ = { _expression_ | DEFAULT } |
                    ( _column_name_ [, ...] ) = [ ROW ] ( { _expression_ | DEFAULT } [, ...] ) |
                    ( _column_name_ [, ...] ) = ( _sub-SELECT_ )
                  } [, ...]
              [ WHERE _condition_ ]

Если происходит конфликт, обработка идёт в ON CONFLICT,

  • если ON CONFLICT DO NOTHING, то если будет ошибка, то ничего не делаем(не вставляем, не заменяем)
  • если ON CONFLICT DO UPDATE SET, то заменем

%%upsert, автоинкремент%%

UPDATE

[ WITH [ RECURSIVE ] _with_query_ [, ...] ]
UPDATE [ ONLY ] _table_name_ [ * ] [ [ AS ] _alias_ ]
    SET { _column_name_ = { _expression_ | DEFAULT } |
          ( _column_name_ [, ...] ) = [ ROW ] ( { _expression_ | DEFAULT } [, ...] ) |
          ( _column_name_ [, ...] ) = ( _sub-SELECT_ )
        } [, ...]
    [ FROM _from_item_ [, ...] ]
    [ WHERE _condition_ | WHERE CURRENT OF _cursor_name_ ]
    [ RETURNING [ WITH ( { OLD | NEW } AS _output_alias_ [, ...] ) ]
                { * | _output_expression_ [ [ AS ] _output_name_ ] } [, ...] ]

🌱 Авторы:
salt-caramel
notakeith