создадим небольшую базу данных для хранения документов и смоделируем пример с представлениями, чтобы показать, как работают рекурсивные зависимости и как удалять/восстанавливать объекты.
1. Создание структуры базы данных
-- Таблица для типов документов
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
Показывает последние версии каждого документа.
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
Объединяет метаданные документов с их последними версиями.
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
Объединяет информацию о документах с их авторами.
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;
3. Поиск зависимостей представлений
WITH RECURSIVE view_dependencies AS (
SELECT
c.oid AS view_oid,
c.relname AS view_name,
n.nspname AS schema_name,
NULL::text AS depends_on
FROM pg_class c
JOIN pg_namespace n ON c.relnamespace = n.oid
WHERE c.relkind = 'v' -- только представления
AND n.nspname = 'public'
AND c.relname IN ('author_documents', 'document_details', 'latest_document_versions')
UNION ALL
SELECT
d.refobjid AS view_oid,
c.relname AS view_name,
n.nspname AS schema_name,
d.objid::regclass::text AS depends_on
FROM pg_depend d
JOIN pg_class c ON d.refobjid = c.oid
JOIN pg_namespace n ON c.relnamespace = n.oid
WHERE d.classid = 'pg_class'::regclass
AND d.refclassid = 'pg_class'::regclass
AND c.relkind = 'v'
)
SELECT * FROM view_dependencies;
Description
Languages
SQL
100%