CREATE DATABASE LibraryDB;
GO
USE LibraryDB;
GO
-- 1. Читатели
CREATE TABLE Readers (
id_reader INT PRIMARY KEY IDENTITY(1,1),
last_name VARCHAR(50) NOT NULL,
first_name VARCHAR(50) NOT NULL,
middle_name VARCHAR(50),
home_address VARCHAR(150) NOT NULL,
work_phone VARCHAR(20),
home_phone VARCHAR(20),
birth_date DATE NOT NULL,
ticket_number INT NOT NULL UNIQUE,
-- Должен быть указан хотя бы один телефон
CHECK (work_phone IS NOT NULL OR home_phone IS NOT NULL)
);
-- 2. Области знаний
CREATE TABLE KnowledgeAreas (
id_knowledge_area INT PRIMARY KEY IDENTITY(1,1),
unique_number INT NOT NULL UNIQUE,
name VARCHAR(100) NOT NULL
);
-- 3. Издательства
CREATE TABLE Publishers (
id_publisher INT PRIMARY KEY IDENTITY(1,1),
name VARCHAR(100) NOT NULL,
city VARCHAR(100) NOT NULL
);
-- 4. Книги
CREATE TABLE Books (
id_book INT PRIMARY KEY IDENTITY(1,1),
unique_code VARCHAR(50) NOT NULL UNIQUE,
title VARCHAR(150) NOT NULL,
author VARCHAR(100),
coauthors VARCHAR(255),
id_publisher INT NOT NULL,
publication_year INT NOT NULL,
page_count INT NOT NULL,
FOREIGN KEY (id_publisher)
REFERENCES Publishers(id_publisher),
-- В библиотеке книги только начиная с 1960 года
CHECK (publication_year >= 1960),
CHECK (page_count > 0),
-- Если нет автора, не должно быть соавторов
CHECK (
author IS NOT NULL
OR coauthors IS NULL
)
);
-- 5. Связь книг и областей знаний
-- Одна книга может относиться к нескольким областям знаний,
-- и одна область знаний может содержать несколько книг.
CREATE TABLE BookKnowledgeAreas (
id_book INT NOT NULL,
id_knowledge_area INT NOT NULL,
PRIMARY KEY (id_book, id_knowledge_area),
FOREIGN KEY (id_book)
REFERENCES Books(id_book),
FOREIGN KEY (id_knowledge_area)
REFERENCES KnowledgeAreas(id_knowledge_area)
);
-- 6. Экземпляры книг
CREATE TABLE BookCopies (
id_copy INT PRIMARY KEY IDENTITY(1,1),
inventory_number INT NOT NULL UNIQUE,
id_book INT NOT NULL,
is_available BIT NOT NULL DEFAULT 1,
FOREIGN KEY (id_book)
REFERENCES Books(id_book)
);
-- 7. Выдача книг
CREATE TABLE BookIssues (
id_issue INT PRIMARY KEY IDENTITY(1,1),
id_reader INT NOT NULL,
id_copy INT NOT NULL,
issue_date DATE NOT NULL,
return_date DATE,
FOREIGN KEY (id_reader)
REFERENCES Readers(id_reader),
FOREIGN KEY (id_copy)
REFERENCES BookCopies(id_copy),
CHECK (
return_date IS NULL
OR return_date >= issue_date
)
);