101 lines
3.0 KiB
Markdown
101 lines
3.0 KiB
Markdown
|
|
#### создадим небольшую базу данных для хранения документов и смоделируем пример с представлениями, чтобы показать, как работают рекурсивные зависимости и как удалять/восстанавливать объекты.
|
|||
|
|
|
|||
|
|
## 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;
|
|||
|
|
```
|
|||
|
|
|