-- Создание базы данных
CREATE DATABASE LibraryDB;
GO
USE LibraryDB;
GO
-- 1. Таблица: Книга
CREATE TABLE Книга (
ID_Книги INT IDENTITY(1,1) PRIMARY KEY,
Название NVARCHAR(255) NOT NULL,
Фамилия_Автора NVARCHAR(100) NULL,
Фамилия_Соавторов NVARCHAR(255) NULL,
Место_Издания NVARCHAR(100) NULL,
Издательство NVARCHAR(100) NULL,
Год_Издания INT NULL,
Кол_Страниц INT NULL,
Кол_Экземпляров INT NULL,
-- Ограничение: книги, изданные начиная с 1960 по текущий год (2026)
CONSTRAINT CHK_Год_Издания CHECK (Год_Издания BETWEEN 1960 AND 2026),
-- Ограничение: соавторы не могут существовать без основного автора
CONSTRAINT CHK_Соавторство CHECK (
(Фамилия_Соавторов IS NULL) OR
(Camp_Соавторов IS NOT NULL AND Фамилия_Автора IS NOT NULL)
)
);
GO
-- 2. Таблица: Экземпляр книги
CREATE TABLE Экземпляр_Книги (
Инвентарный_Номер INT PRIMARY KEY,
ID_Книги INT NOT NULL,
Шифр_Книги NVARCHAR(50) NOT NULL,
Присутствие BIT NOT NULL DEFAULT 1,
-- Внешний ключ: при удалении книги удаляются и её копии
CONSTRAINT FK_Экземпляр_Книга FOREIGN KEY (ID_Книги)
REFERENCES Книга(ID_Книги) ON DELETE CASCADE
);
GO
-- 3. Таблица: Читатель
CREATE TABLE Читатель (
Номер_Билета INT IDENTITY(1,1) PRIMARY KEY,
ФИО NVARCHAR(150) NOT NULL,
Домашний_Адрес NVARCHAR(255) NOT NULL,
Телефон_Рабочий NVARCHAR(20) NULL,
Телефон_Домашний NVARCHAR(20) NULL,
Дата_Рождения DATE NOT NULL,
-- Ограничение: возраст читателя не моложе 17 лет
CONSTRAINT CHK_Возраст CHECK (DATEDIFF(year, Дата_Рождения, GETDATE()) >= 17),
-- Ограничение: обязательное наличие хотя бы одного из двух телефонов
CONSTRAINT CHK_Телефоны CHECK (Телефон_Рабочий IS NOT NULL OR Телефон_Домашний IS NOT NULL)
);
GO
-- 4. Таблица: Выдача книги
CREATE TABLE Выдача_Книги (
ID_Выдачи INT IDENTITY(1,1) PRIMARY KEY,
Инвентарный_Номер INT NOT NULL,
Номер_Билета INT NOT NULL,
Дата_Выдачи DATE NOT NULL DEFAULT GETDATE(),
Дата_Возврата DATE NULL,
-- Внешние ключи для связи сущностей
CONSTRAINT FK_Выдача_Экземпляр FOREIGN KEY (Инвентарный_Номер)
REFERENCES Экземпляр_Книги(Инвентарный_Номер),
CONSTRAINT FK_Выдача_Читатель FOREIGN KEY (Номер_Билета)
REFERENCES Читатель(Номер_Билета)
);
GO