Файл: Первый вопрос Иерархические базы данных.docx

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 29.10.2023

Просмотров: 310

Скачиваний: 6

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.


Так как должность участника зависит от самого участника, то уже избыточные данные и их нужно вынести в отдельную таблицу



Благодаря декомпозиции мы перевели таблицы во вторую форму

  1. 3НФ

Третья нормальная форма связана с транзитивными зависимостями.

Транзитивная зависимость — это зависимость не ключевых полей от других не ключевых полей (мб то есть объединение нескольких таблиц в одну, исправляется декомпозицией).

Требование: отсутствие транзитивных зависимостей

Пример. Таблица находится во второй форме



Описание подразделения зависит от поля подразделения, это также избыточная информация. Поэтому нужна декомпозиция.



  1. 4НФ

Четвертая форма связана с многозначной зависимостью

Требование:

Отсутствие тривиальных многозначных зависимостей.

Многозначная тривиальная зависимость: таблица имеет как минимум три столбца, допустим A, B и C, при этом B и C между собой никак не связаны и не зависят друг от друга, но по отдельности зависят от A, и для каждого значения A есть множество значений B, а также множество значений C.

Пример



Однако она не находится в четвертой нормальной форме, так как здесь есть многозначная зависимость

Курс ->-> Преподаватель

Курс ->-> Аудитория

Т.е. для каждого курса в этой таблице может быть несколько преподавателей, а также несколько аудиторий.

Решается декомпозицией



  1. БКНФ

Нормальная форма Бойса-Кодда – промежуточная форма между 3 и 4 формы.

Требование:

Ключевые атрибуты составного ключа не должны зависеть от неключевых атрибутов.

Отсюда следует, что требования нормальной формы Бойса-Кодда предъявляются только к таблицам, у которых первичный ключ составной. Таблицы, у которых первичный ключ простой, и они находятся в третьей нормальной форме, автоматически находятся и в нормальной форме Бойса-Кодда.


Пример. Таблица в 3 форме



Только один куратор может отвечать за одно направление. Поэтому зная куратора, можем определить направление, т.е. «Направление», зависит от неключевого атрибута, т.е. «Куратора».

Проведем декомпозицию и получим таблицу с нормальной формы Бойса-Кодда.



  1. 5НФ

Требование:

Первичный ключ должен состоять как минимум из 3 полей и эти 3 поля не связанны между собой попарно.

Решение заключается в создание для каждой зависимости (всего 3) таблицы. Но есть ограничение при соединении этих таблиц, есть возможность потерять данные и могут появиться новые данные.

  1. Подъязыки SQL

SQL—язык структурированных запросов, применяемый для создания, модификации, извлечения и управления данными в реляционной базе данных, управляемой соответствующей системой управления базами данных.

Подразделяется на несколько подъязыков, а именно DDL (определение, создание данных), DQL (выборка, извлечение данных), DML (изменение, модификации данных), TCL (управление транзакциями)

  1. Команды DML

Команды DML отвечают за манипулирование данными в объектах базы данных (обновление, удаление и вставка). В эти команды входят UPDATE, DELETE, INSERT

INSERT – вставка данных в таблицу

INSERT INTO name_tab (name_pol1, name_pol2, …) VALUES (…, …, …), (…, …, …);

Особенности записи данных с не заполнением поля с NOT NULL (не позволит добавить данные), DEFAULT (вставит данные по умолчанию), типы данных serial (счетчик).

Если мы заполняем все столбца (включая ключевое поле) согласно их порядку в таблице, то можно использовать сокращенную запись вставки (без указания полей):

INSERT INTO name_tab VALUES (…, …, …), (…, …, …);

Лучшего всего добавлять несколько строчек (записей данных) в таблицу чем отдельно каждую из-за быстроты исполнения sql (каждый раз приходится открывать и закрывать соединение)

INSERT INTO name_tab SELECT …; (вставка данных из запроса)

INSERT INTO name_tab (name_pol1, name_pol2, …) VALUES (…, …, …), (…, …, …) RETURNING *//name_pol; (вставка в таблицу и вывод (вернуть) результат (на экран))

UPDATE – изменение данных в таблице

UPDATE name_tab SET name_pol = значение, выражение (2+4, name_pol * 3) // (name_pol1, name_pol2, …) = (…, …, …) WHERE name_pol … ;



RETURNING – такая же функция и синтаксис как и у INSERT

… FROM name_tab2 WHERE name_tab2.name_pol … (изменение строк в таблице, на основе отбора данных из других связанных с ней таблицах)

Если записи нет, которая удовлетворяет условию отбора, то UPDATE упадет с ошибкой

DELETE – удаление данных в таблице

DELETE FROM name_tab WHERE ….

RETURNING – такая же функция и синтаксис как и у INSERT

… USING name_tab2 WHERE name_tab2.name_pol … (изменение строк в таблице, на основе отбора данных из других связанных с ней таблицах)

TRANCATE name_tab (более быстрее, но удаляет все записи (создает новую таблицу с тем же именем)) == DELETE FROM name_tab

  1. Команды DDL

Команды DDL отвечают за создание, удаления и изменения объектов базы данных. Все команды можно разделить на 3 группы CREATE, ALTER, DROP.

Для каждого объекта БД есть свои команды DDL

Например, для таблицы:

CREATE [GLOBAL (для всех баз данных) // LOCAL (для текущей)] [TEMP (таблица удалится после выхода из сессии клиента)] TABLE [IF NOT EXISTS] new_tab (создание полей)
[LIKE name_tab (создание таблицы на основе другой таблицы)];

Создание полей: new_name_pol ТИП данных [COLLATE правило сортировки] [ограничения (NOT NULL, CHECK (name _pol логическое выражение)), DEFAULT выражение, UNIQUE, PRIMARY KEY, REFERENCES table (name_pol)]

CREATE TABLE new_table AS SELECT … FROM table (создание таблицы на основе запроса и со вставкой данных из запроса)

ALTER TABLE name_tab RENAME [COLUMN] TO new_name_table [name_pol TO new_name_pol] это операция безопасна только если нет ссылок на поле которое меняет имя

ALTER TABLE name_tab …

ADD [COLUMN] new_name_pol тип данных … (но при добавлении нового поля все записи этой колонки будут null, поэтому при добавлении NOT NULL нужно обязательно добавлять DEFAULT)

DROP [COLUMN] name_pol (нельзя если внешний ключ, первичный ключ)

… ALL IN TABLESPACE name SET TABLESPACE new_name_tab


Tablespace это объект базы данных, который связан с определенном месте на жёстком диске

… ALTER [ COLUMN ] name_pol [ SET DATA ] TYPE тип_данных

… ALTER [ COLUMN ] name_pol SET DEFAULT выражение

… ALTER [ COLUMN ] name_pol DROP DEFAULT

… ADD CONSTRAINT new_name_cons CHECK (name_pol …)// UNIQUE (name_pol) // …

DROP TABLE [IF EXISTS] name_tab [CASCADE // RESTRICT];

-CASCADE- удаление всех связанных, зависимых объектов от таблицы

-RESTRICT- запрет на удаление таблицы, если есть зависимые объекты

Если таблицы нет и мы хотим удалить, то возникнет ошибка и скрипт из файла приостановит свою работу, поэтому лучше прописывать IF EXISTS

  1. Типы данных SQL

Каждый столбец и домен, из которого берутся значения в этот столбец, имеют свой тип данных.

CHARACTER STRING - символьные (текстовые) данные;

NATIONAL CHARACTER - символьные данные, соответствующие национальному языку;

BIT STRING - двоичные данные;

EXACT NUMERIC - числа, точно соответствующие своей записи;

APPROXIMATE NUMERIC - числа в научной нотации (мантисса и порядок);

DATETIME - дата и время;

INTERVAL - период времени между двумя точками отсчёта.

Разработчики СУБД нарушают стандарты SQL: наборы типов данных в разных СУБД отличаются друг от друга. Например, в СУБД MS SQL Server, MS ACCESS, PostgreSQL есть тип данных MONEY, а в Oracle и в MySQL отсутствует. Различие типов данных является одной из причин несовместимости различных СУБД и возникающих трудностей при переносе базы данных из одной СУБД в другую.

Типы данных в PostgreSQL

Числовые типы: smallint (2 байта), integer (4 байта), bigint (8 байт), очень большие типы decimal (точность, масштаб) и numeric (точность, масштаб) (вещественные числа), real (4 байта), double precision (8 байт).

Масштаб значения numeric определяет количество десятичных цифр в дробной части, справа от десятичной точки, а точность — общее количество значимых цифр в числе, т. е. количество цифр по обе стороны десятичной точки.

Типы decimal и numeric равнозначны. Оба эти типа описаны в стандарте SQL.

Типы данных с авто увеличением: smallserial (2), serial(4), bigserial(8)

Денежные типы: money (8) (дробное число с двумя знаками после запятой)

Символьные типы: varchar(n), char(n) (добавляются пробелы до максимума строки), text (строка неограниченной переменной длины)

Логический тип: boolean (1 байт) (true: yes, on, 1) (false: no, off, 0)

Дата и время:
timestamp (год, число, месяц, часов, минут, секунд, миллисекунд), date (год, месяц, число), time (часы, минуты, секунды), interval (поля) (разница между двумя датами)

Timestamp и time [without time zone// with time zone] имеют дополнительный параметр часовой пояс, который меняет время в зависимости от часового пояса клиента.

  1. Домены типа

Домен — это собственный, ограниченный тип данных

Домены используют если в таблицах есть столбцы, обладающие одними и теми же характеристиками, можно предварительно описать тип такого столбца и использовать ее в дальнейшем в БД

Так табельный номер — это целочисленный тип данных, но он не может быть отрицательным или равным нулю

CREATE DOMAIN new_name AS тип данных

[COLLATE правило сортировки]

[DEFAULT выражение]

[NOT NULL // NULL // CHECK (выражение)]

Ограничение по уникальности (UNIQE) не допустимо в описании создания домена.

ALTER DOMAIN name_dom

… SET DAFAULT выражение

… DROP DFAULT

… SET//DROP ограничения (NOT NULL)

… ADD CONSTRAINT new_name_cons CHECK (VALUE выражение)

… DROP CONSTRAINT name_cons

… RENAME CONSTRAINT name_cons TO new_name_cons

… RENAME new_name_dom

Добавить ограничение можно только тогда, когда данные под этим доменном в уже соответствуют этим ограничениям, иначе будет ошибка

DROP DOMAIN [IF EXITSTS] name_dom [name_dom1, name_dom2, …] [CASCADE // RESTRICT (запрет удаления домена, если есть зависящие от него объекты) (значение по умолчанию)]

  1. Синтаксис Select

Язык запросов DQL включает одну команду SELECT. Эта команда многочисленными опциями и предложениями используется для формирования запросов к Реляционной БД.

Реляционные операции: проекция (перечисление нужных столбцов в select) и отбор (оператор where - оператор выбора строк в select)

SELECT извлекает данные из таблицы и выдает их в виде таблицы.

SELECT {1} FROM {2} WHERE {3}

{1} можно использовать * - вывод всех колонок, если несколько источников данных то * указывается через предикат, пример table1.*

Можно использовать перечисления необходимых колонок пример name_pol1, name_pol2

Можно использовать константы (1, 43, 450), строки, выражения например (1 + 2), (name_pol3 * 2) и тд. Но необходимо задавать имя этому выражение ((1 + 2) AS new_name), иначе sql задаст имя этому выражение: ‘?column?’

Возможно задавать тип псевдо колонки, которое состоит из выражения, через ::. Примеры 42::integer, (1+2)::float

Можно использовать функции (avg(), sum(), max(), min(), count(), now () (выдача полного времени), пользовательские функции)