Создание базы данных SQL и таблиц базы данных на примере
Назад<<< | Содержание | Вперёд>>> |
Создадим базу данных, краткое описание проекта которой - в статье Основы проектирования базы данных - пример.
Для этого понадобится установленная система управления базами данных (СУБД) DB2. Мы будем использовать диалект языка SQL, который используется именно в этой СУБД.
Первая команда, которую мы будем применять для создании базы данных - это команда CREATE DATABASE. Её синтаксис следующий:
Далее для создания таблиц нашей базы данных будем многократно использовать команду CREATE TABLE. Её синтаксис следующий:
Так как наша база данных моделирует сеть аптек, то в ней есть такие сущности, как "Аптека" (таблица Pharmacy в нашем примере создания базы данных), "Препарат" (таблица Preparation в нашем примере создания базы данных), "Доступность (препаратов в аптеке)" (таблица Availability в нашем примере создания базы данных), "Клиент" (таблица Client в нашем примере создания базы данных) и другие, которые здесь подробно и разберём.
Разработке модели "сущность-связь" можно посвятить не одну статью, но если нас прежде всего интересуют команды языка SQL для создания базы данных и таблиц в ней, то условимся считать, что связи между сущностями уже нам понятны. На рисунке ниже приведено представление модели нашей базы данных с атрибутами сущностей (таблиц) и связями между таблицами.
Для увеличения рисунка можно нажать на него левой кнопкой мыши.

При создании базы данных, в которой таблицы связаны между собой, важно позаботиться о целостности данных. Это означает, например, что если если удалить препарат из таблицы Preparation, то должны удалиться все записи этого препарата в таблице Availability. Ещё пример ограничения целостности: нужно установить запрет на удаление названия группы препарата из таблицы Group, если существует хотя бы один препарат этой группы. Особый случай составляет изменение данных в одной таблице, когда производятся действия с данными в другой таблице. Об этом поговорим в конце статьи. Можно также углубиться в теорию на уроке Реляционная модель данных.
Как уже говорилось, в разбираемом здесь примере создания базы данных использовался вариант языка SQL, который используется в системе управления базами данных (СУБД) DB2. Он является регистронезависимым, то есть не имеет значение, набраны ли команды и отдельные слова в них строчными или прописными буквами. Для иллюстрации этой особенности приведены команды без особой системы набранные строчными и прописными буквами.
Теперь приступим к созданию команд. Первая наша команда SQL создаёт базу данных PHARMNETWORK:
Код SQL
Описание таблицы PHARMACY (Аптека):
Имя поля | Тип данных | Описание |
PH_ID | smallint | Идентификационный номер аптеки |
Address | varchar(40) | Адрес аптеки |
Пишем команду, которая создаёт таблицу PHARMACY (Аптека), значения первичного ключа PH_ID генерируются автоматически от 1 с шагом 1, вносится проверка на то, чтобы значения атрибута Address в этой таблице были уникальными:
Код SQL
Следует обратить внимание на то, что автоматическое генерирование первичного ключа с приращением обеспечено средствами, применяемыми в диалекте SQL для DB2:
Код SQL
Средства автоматического генерирования первичного ключа с приращением (кратко это называется автоинкрементом) в разных диалектах SQL различаются. Так, в MySQL используется ключевое слово AUTO_INCREMENT и соответствующая часть запроса на создание таблицы выглядит следующим образом:
Код SQL
В SQL Server механизм автоинктемента обеспечивается так:
Код SQL
Запись (1, 1) здесь означает, что значения первичного ключа должны создаваться начиная с 1 с приращением на 1. Итак, помните о том, что в зависимости от СУБД и диалекта SQL механизмы автоинкремента различаются, а далее для краткости будем приводить запросы на создание таблиц в соответствии с синтаксисом для DB2.
Описание таблицы GROUP (Группа препаратов):
Имя поля | Тип данных | Описание |
GR_ID | smallint | Идентификационный номер группы препаратов |
Name | varchar(40) | Название группы препаратов |
Пишем команду, которая создаёт таблицу Group (Группа препаратов), значения первичного ключа GR_ID генерируются автоматически от 1 с шагом 1, проводится проверка уникальности наименования группы (для этого используется ключевое слово CONSTRAINT):
Код SQL
Описание таблицы PREPARATION (Препарат):
Имя поля | Тип данных | Описание |
PR_ID | smallint | Идентификационный номер препарата |
GR_ID | smallint | Идентификационный номер группы препарата |
Name | varchar(40) | Название препарата |
Команда, которая создаёт таблицу PREPARATION, значения первичного ключа PR_ID генерируются автоматически от 1 с шагом 1, определяется, что значения внешнего ключа GR_ID (Группа препаратов) не могут принимать значение NULL, определена проверка уникальности значений атрибута Name:
Код SQL
Далее нам требуется позаботиться об ограничениях целостности. Это очень удобно слелать с помощью команды alter table. Эта команда изучается на уроке SQL ALTER TABLE - изменение таблицы базы данных.
Теперь самое время создать таблицу AVAILABILITY (Доступность или Наличие препарата в аптеке). Её описание:
Имя поля | Тип данных | Описание |
A_ID | smallint | Идентификационный номер записи о доступности |
PH_ID | smallint | Идентификационный номер аптеки |
PR_ID | smallint | Идентификационный номер препарата |
Quantity | int | Количество доступного препарата |
DateStart | varchar(20) | Дата начала работы аптеки с данным препаратом |
DateEnd | varchar(20) | Дата окончания работы аптеки с данным препаратом |
Mart | varchar(3) | Выставлен ли препарат на витрину |
Пишем команду, которая создаёт таблицу AVAILABILITY. Определяются даты начала (не может быть NULL) и окончания (по умолчанию NULL).
Код SQL
Создаём таблицу DEFICIT (Дефицит препарата в аптеке, то есть, неудовлетворённый запрос). Её описание:
Имя поля | Тип данных | Описание |
D_ID | smallint | Идентификационный номер записи о дефиците |
PH_ID | smallint | Идентификационный номер аптеки |
PR_ID | smallint | Идентификационный номер препарата |
Solution | varchar(40) | Решение проблемы дефицита |
DateStart | varchar(20) | Дата появления проблемы |
DateEnd | varchar(20) | Дата решения проблемы |
Пишем команду, которая создаёт таблицу DEFICIT:
Код SQL
Осталось немного. Мы уже дошли до команды, которая создаёт таблицу Employee (Сотрудник). Её описание:
Имя поля | Тип данных | Описание |
E_ID | smallint | Идентификационный номер сотрудника |
PH_ID | smallint | Идентификационный номер аптеки |
FName | varchar(40) | Имя сотрудника |
LName | varchar(40) | Фамилия сотрудника |
Post | varchar(40) | Должность |
Пишем команду, которая создаёт таблицу Employee (Сотрудник), с первичным ключом, генерируемым по тем же правилам, что и первичные ключи предыдущих таблиц, в которых они существуют. Внешним ключом PH_ID Сотрудник связан с PHARMACY (Аптекой).:
Код SQL
Очередь дошла до создании таблицы CLIENT (Клиент). Её описание:
Имя поля | Тип данных | Описание |
C_ID | smallint | Идентификационный номер клиента |
FName | varchar(40) | Имя клиента |
LName | varchar(40) | Фамилия клиента |
DateReg | varchar(20) | Дата регистрации |
Пишем команду, создающую таблицу CLIENT (Клиент), в отношении первичного ключа которого справедливо предыдущее описание. Особенность этой таблицы в том, что её атрибуты F_Name и L_Name имеют по умолчанию значение NULL. Это связано с тем, что клиенты могут быть как зарегистрированными, так и незарегистрированными. У последних значения имени и фамилии как раз и будут неопределёнными (то есть NULL):
Код SQL
Предпоследняя таблица в нашей базе данных - таблица BASKET (Корзина покупок). Её описание:
Имя поля | Тип данных | Описание |
BS_ID | smallint | Идентификационный номер корзины покупок |
E_ID | smallint | Идентификационный номер сотрудника, оформившего корзину |
C_ID | smallint | Идентификационный номер клиента |
Пишем команду, создающую таблицу BASKET (Корзина покупок), так же с уникальным и инкрементируемым первичным ключом и связанную внешним ключами C_ID и E_ID с Клиентом и Сотрудником соответственно:
Код SQL
И, наконец, последняя таблица в нашей базе данных - таблица BUYING (покупка). Её описание:
Имя поля | Тип данных | Описание |
B_ID | smallint | Идентификационный номер покупки |
PH_ID | smallint | Идентификационный номер аптеки |
PR_ID | smallint | Идентификационный номер препарата |
BS_ID | varchar(40) | Идентификационный номер корзины покупок |
Price | varchar(20) | Цена |
Date | varchar(20) | Дата |
Пишем команду, создающую таблицу BUYING (покупка), так же с уникальным и инкрементируемым первичным ключом и связанную внешними ключами BS_ID, PH_ID, PR_ID с Корзиной покупок, Аптекой и Препаратом соответственно:
Код SQL
И совсем уже в завершение темы создания базы данных обещанное отступление о соблюдении ограничений целостности, когда решение - более сложное, чем написание команды. В нашем примере необходимо соблюдать следующее условие: при покупке единицы препарата значение количества этого препарата в таблице AVAILABILITY должно соответственно уменьшиться. Вообще говоря, для таких операций в языке SQL существуют особые средства, называемые триггерами. Но триггеры - вещь капризная: на практике они могут и не сработать или сработать не так, как предусмотрено. Поэтому разработчики по возможности ищут программные средства решения таких задач, пример которых упомянут в этом абзаце.
И действительно, есть программное средство решение обозначенной выше задачи уменьшения значения количества препарата. А именно: в условии добавления соответствующего препарата в таблицу BUYING (Покупка) пишется функция на языке программирования, на котором выполнено приложение, с запросом с ключевым словом UPDATE на замену значения количества этого препарата на единицу меньше в той же аптеке. И таблица BUYING, и таблица AVAILABILITY имеют внешний ключ PH_ID - идентификатор определённой аптеки.
На этом многогранная тема создания баз данных прерывается...
Поделиться с друзьями
Назад<<< | Содержание | Вперёд>>> |