Допустим, мы делаем социальную сеть. У нас есть таблица постов и таблица тегов. Каждый пост может содержать несколько тегов, и наоборот, каждый тег может использоваться в нескольких постах. В общем случае, у нас есть два типа сущностей - A и B. Каждый экземпляр сущности типа A может быть связан с несколькими экземплярами типа B, и наоборот, каждый экземпляр сущности типа B может быть связан с несколькими экземплярами типа A. Это и есть отношение "много-ко-многим". Допустим, у нас есть таблица постов...
"Мы"-Прогер
Внешние ключи в SQL - Изучаем SQL на примере Postgres
Пусть у нас есть таблица преподавателей: и таблица предметов: Таблица предметов ссылается на таблицу преподавателей - в колонке teacher_id стоит id преподавателя, который ведёт данный предмет. То есть, математику и физику ведёт преподаватель с id = 1 (Умняков), а русский язык - преподаватель с id = 2 (Языков). Однако сейчас можно сломать данные: в teacher_id можно указать id несуществующего преподавателя, например, "-9999". Данные может сломать как неаккуратный пользователь, так и приложение, работающее с вашей базой, если программисты в нём что-нибудь напутают...
Первичные ключи в SQL
Ранее мы обсуждали, что в каждой таблице нужен столбец с идентификатором, чтобы можно было различать строки между собой. Столбец или набор столбцов, используемых для различения строк между собой, и называется первичным ключом (Primary Key). То есть, почти всегда первичный ключ - это колонка id. Но бывают и сложные случаи. Например, в таблице оценок ограничение уникальности (предмет, ученик, дата урока) можно было бы сделать первичным ключом, а колонку id убрать. Однако на практике лучше всегда делать дополнительный столбец id, чтобы во всех таблицах было единообразие...
Изменение таблиц на SQL
Для создания таблиц мы использовали команду "CREATE TABLE": CREATE TABLE имя_схемы.имя_таблицы ( колонка1 тип_данных1, колонка2 тип_данных2, ... ); Для удаления таблиц есть команда "DROP TABLE": DROP TABLE имя_схемы.имя_таблицы; А для изменения таблицы есть команда "ALTER TABLE". Её сейчас и рассмотрим. ALTER TABLE имя_схемы.имя_таблицы ADD COLUMN имя_новой_колонки тип_данных; Например, добавим в таблицу education.students2 колонку "new_column", которая может хранить текст...
Нормализация баз данных - Изучаем SQL на примере Postgres
Итак, мы научились создавать и изменять таблицы. Однако в реальных базах данных, где десятки таблиц, не всё так просто. Нужно уметь правильно спроектировать архитектуру - какие будут таблицы, какие колонки в каждой из них и какие будут связи между таблицами. Рассмотрим таблицу оценок: Здесь первичным ключом является комбинация (предмет, студент, дата занятия). За одно занятие один студент может получить несколько оценок, поэтому колонка "values" ("значения") имеет тип smallint[] (массив из маленьких целых чисел)...
Ограничения в SQL. Ограничение уникальности
Допустим, у нас есть таблица учеников. Пусть мы хотим добавить к ней столбец "email" с электронной почтой. Этот столбец всегда должен иметь значение, то есть, должен быть NOT NULL. Однако здесь можно добавить ещё одно ограничение - у каждого ученика своя уникальная почта, то есть, значение в колонке почты не может повторяться. Такое ограничение называется ограничением уникальности (UNIQUE). Мы ещё это не изучали, но ограничения бывают разными: уникальности UNIQUE, первичного ключа PRIMARY KEY, внешнего...
