postgreSQL_def/readme.md
2025-02-16 19:30:00 +08:00

101 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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