ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 29.10.2023
Просмотров: 310
Скачиваний: 6
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
Так как должность участника зависит от самого участника, то уже избыточные данные и их нужно вынести в отдельную таблицу
Благодаря декомпозиции мы перевели таблицы во вторую форму
-
3НФ
Третья нормальная форма связана с транзитивными зависимостями.
Транзитивная зависимость — это зависимость не ключевых полей от других не ключевых полей (мб то есть объединение нескольких таблиц в одну, исправляется декомпозицией).
Требование: отсутствие транзитивных зависимостей
Пример. Таблица находится во второй форме
Описание подразделения зависит от поля подразделения, это также избыточная информация. Поэтому нужна декомпозиция.
-
4НФ
Четвертая форма связана с многозначной зависимостью
Требование:
Отсутствие тривиальных многозначных зависимостей.
Многозначная тривиальная зависимость: таблица имеет как минимум три столбца, допустим A, B и C, при этом B и C между собой никак не связаны и не зависят друг от друга, но по отдельности зависят от A, и для каждого значения A есть множество значений B, а также множество значений C.
Пример
Однако она не находится в четвертой нормальной форме, так как здесь есть многозначная зависимость
Курс ->-> Преподаватель
Курс ->-> Аудитория
Т.е. для каждого курса в этой таблице может быть несколько преподавателей, а также несколько аудиторий.
Решается декомпозицией
-
БКНФ
Нормальная форма Бойса-Кодда – промежуточная форма между 3 и 4 формы.
Требование:
Ключевые атрибуты составного ключа не должны зависеть от неключевых атрибутов.
Отсюда следует, что требования нормальной формы Бойса-Кодда предъявляются только к таблицам, у которых первичный ключ составной. Таблицы, у которых первичный ключ простой, и они находятся в третьей нормальной форме, автоматически находятся и в нормальной форме Бойса-Кодда.
Пример. Таблица в 3 форме
Только один куратор может отвечать за одно направление. Поэтому зная куратора, можем определить направление, т.е. «Направление», зависит от неключевого атрибута, т.е. «Куратора».
Проведем декомпозицию и получим таблицу с нормальной формы Бойса-Кодда.
-
5НФ
Требование:
Первичный ключ должен состоять как минимум из 3 полей и эти 3 поля не связанны между собой попарно.
Решение заключается в создание для каждой зависимости (всего 3) таблицы. Но есть ограничение при соединении этих таблиц, есть возможность потерять данные и могут появиться новые данные.
-
Подъязыки SQL
SQL—язык структурированных запросов, применяемый для создания, модификации, извлечения и управления данными в реляционной базе данных, управляемой соответствующей системой управления базами данных.
Подразделяется на несколько подъязыков, а именно DDL (определение, создание данных), DQL (выборка, извлечение данных), DML (изменение, модификации данных), TCL (управление транзакциями)
-
Команды 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
-
Команды 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
-
Типы данных 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] имеют дополнительный параметр часовой пояс, который меняет время в зависимости от часового пояса клиента.
-
Домены типа
Домен — это собственный, ограниченный тип данных
Домены используют если в таблицах есть столбцы, обладающие одними и теми же характеристиками, можно предварительно описать тип такого столбца и использовать ее в дальнейшем в БД
Так табельный номер — это целочисленный тип данных, но он не может быть отрицательным или равным нулю
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 (запрет удаления домена, если есть зависящие от него объекты) (значение по умолчанию)]
-
Синтаксис 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 () (выдача полного времени), пользовательские функции)