#### создадим небольшую базу данных для хранения документов и смоделируем пример с представлениями, чтобы показать, как работают рекурсивные зависимости и как удалять/восстанавливать объекты. ## 1. Создание структуры базы данных ```sql -- Таблица для типов документов CREATE TABLE document_types ( type_id SERIAL PRIMARY KEY, type_name VARCHAR(100) NOT NULL ); -- Таблица для метаданных документов CREATE TABLE documents ( doc_id SERIAL PRIMARY KEY, title VARCHAR(255) NOT NULL, type_id INT REFERENCES document_types(type_id), created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Таблица для версий документов CREATE TABLE document_versions ( version_id SERIAL PRIMARY KEY, doc_id INT REFERENCES documents(doc_id), content TEXT NOT NULL, version_number INT NOT NULL, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- Таблица для авторов документов CREATE TABLE authors ( author_id SERIAL PRIMARY KEY, name VARCHAR(100) NOT NULL, email VARCHAR(100) ); -- Таблица для связи документов с авторами CREATE TABLE document_authors ( doc_id INT REFERENCES documents(doc_id), author_id INT REFERENCES authors(author_id), PRIMARY KEY (doc_id, author_id) ); ``` ## 2. Создание представлений #### Представление 1: ```latest_document_versions``` Показывает последние версии каждого документа. ```sql CREATE VIEW latest_document_versions AS SELECT dv.doc_id, dv.content, dv.version_number, dv.updated_at FROM document_versions dv JOIN ( SELECT doc_id, MAX(version_number) AS max_version FROM document_versions GROUP BY doc_id ) latest ON dv.doc_id = latest.doc_id AND dv.version_number = latest.max_version; ``` #### Представление 2: ```document_details``` Объединяет метаданные документов с их последними версиями. ```sql CREATE VIEW document_details AS SELECT d.doc_id, d.title, dt.type_name, ldv.content, ldv.updated_at FROM documents d JOIN document_types dt ON d.type_id = dt.type_id LEFT JOIN latest_document_versions ldv ON d.doc_id = ldv.doc_id; ``` #### Представление 3: ```author_documents``` Объединяет информацию о документах с их авторами. ```sql CREATE VIEW author_documents AS SELECT a.name AS author_name, a.email, dd.doc_id, dd.title, dd.type_name, dd.content, dd.updated_at FROM authors a JOIN document_authors da ON a.author_id = da.author_id JOIN document_details dd ON da.doc_id = dd.doc_id; ```