PostgreSQL: промышленная

разработка баз данных
Лекция 7
Реализация мехазма наследования таблиц в PostgreSQL.
Хранимые процедуры. Триггеры и правила (RULE)

Объектно­реляционная СУБД

От управления данными — к управлению объектами и 
знаниями
Наследование классов и объектное поведение

В PostgreSQL:

Комплексные типы данных (встроенные и пользовательские)

Система правил (RULE) для реализации семантики приложения

Ключевое понятие: class

основные (таблицы), виртуальные (представления), унаследованные

Наследование классов

Расширяемость (типы данных, функции, триггеры и правила)

PostgreSQL: промышленная разработка баз данных. Лекция 7

Наследование в PostgreSQL
CREATE TABLE obj (
    obj_id INTEGER, 
    obj_created TIMESTAMPTZ DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE person(
    obj_id INTEGER PRIMARY KEY,
    person_name VARCHAR(32) NOT NULL,
    CHECK(obj_id >= 1000000000 AND obj_id < 2000000000)
) INHERITS(obj);
CREATE TABLE car(
    obj_id INTEGER PRIMARY KEY,
    obj_type_id INT2 NOT NULL DEFAULT 2,
    car_model VARCHAR(16) NOT NULL,
    CHECK(obj_id >= 2000000000 AND obj_id < 3000000000)
) INHERITS(obj);
SET constraint_exclusion TO on;

PostgreSQL: промышленная разработка баз данных. Лекция 7

Наследование в PostgreSQL
obj
obj_id
    
obj_status_did
obj_creator_obj_id
obj_created
obj_modified
obj_commented
obj_marks_count
obj_marks_rating
obj_tsvector

INT8
INT8
INT8
TIMESTAMP
TIMESTAMP
TIMESTAMP
INT4
FLOAT8
tsvector

— «Сквозной» ID
— Значение из справочника
— ID создателя (если применимо)

}­ 

NOT NULL DEFAULT CURRENT_TIMESTAMP

}- оцениваем всё!
— Почти везде нужен полнотекст.

user2obj
u2o_user_obj_id
u2o_obj_obj_id
u2o_mark
u2o_is_favorite

group
user

PostgreSQL: промышленная разработка баз данных. Лекция 7

comment
comment_author_obj_id
comment_text

Партицирование таблиц
CREATE TABLE measurement (
    city_id         int not null,
    logdate         date not null,
    peaktemp        int,
    unitsales       int
);
CREATE TABLE measurement_yy04mm02 (
    CHECK ( logdate >= DATE '2004­02­01' AND logdate < DATE '2004­03­01' )
) INHERITS (measurement);
CREATE TABLE measurement_yy04mm03 (
    CHECK ( logdate >= DATE '2004­03­01' AND logdate < DATE '2004­04­01' )
) INHERITS (measurement);
...

PostgreSQL: промышленная разработка баз данных. Лекция 7

Партицирование таблиц
CREATE RULE measurement_insert_yy04mm02 AS
ON INSERT TO measurement WHERE
    ( logdate >= DATE '2004­02­01' AND logdate < DATE '2004­03­01' )
DO INSTEAD
    INSERT INTO measurement_yy04mm02 VALUES ( NEW.city_id,
                                              NEW.logdate,
                                              NEW.peaktemp,
                                              NEW.unitsales );
...

SET constraint_exclusion = on;
EXPLAIN SELECT count(*) FROM measurement WHERE logdate >= DATE '2006­01­01';
                               QUERY PLAN
­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­
 Aggregate  (cost=63.47..63.48 rows=1 width=0)
   ­>  Append  (cost=0.00..60.75 rows=1086 width=0)
         ­>  Seq Scan on measurement  (cost=0.00..30.38 rows=543 width=0)
               Filter: (logdate >= '2006­01­01'::date)
         ­>  Seq Scan on measurement_yy06mm01 measurement  (cost=0.00..30.38 rows=543 
width=0)
               Filter: (logdate >= '2006­01­01'::date)

PostgreSQL: промышленная разработка баз данных. Лекция 7

Наследование и партицирование: важно 
помнить

Физически данные хранятся только в одной таблице (как 
правило, дочерней)
Индексы необходимо создавать для таблиц, где данные 
хранятся физически
Большая часть ограничений целостности не наследуется

Возможна ситуация с дубликатами в первичном ключе! ..

«Ручной» VACUUM & ANALYZE надо делать на всех таблицах

PostgreSQL: промышленная разработка баз данных. Лекция 7

Функции и хранимые процедуры в 
PostgreSQL

SQL

PL/pgSQL

PL/Perl

PL/Tcl

PL/Python

PL/R

PL/Java

plPHP

plRuby

...и даже больше!

PostgreSQL: промышленная разработка баз данных. Лекция 7

Функции: SQL
CREATE OR REPLACE FUNCTION hello(text)
RETURNS text
AS $BODY$
    SELECT 'Hello ' || $1 || '!';
$BODY$ LANGUAGE sql IMMUTABLE;

PostgreSQL: промышленная разработка баз данных. Лекция 7

Функции: PL/pgSQL
CREATE OR REPLACE FUNCTION hello(text)
RETURNS text
AS $BODY$
BEGIN
    RETURN 'Hello ' || $1 || '!';
END;
$BODY$ LANGUAGE plpgsql IMMUTABLE;

PostgreSQL: промышленная разработка баз данных. Лекция 7

Триггеры
CREATE OR REPLACE FUNCTION ts2_page_title()
RETURNS "trigger"
AS $BODY$
BEGIN
IF TG_OP = 'INSERT' THEN
NEW.titlevector = 
to_tsvector('default',NEW.page_title);
ELSIF NEW.page_title <> OLD.page_title THEN
NEW.titlevector := 
to_tsvector('default',NEW.page_title);
END IF;
RETURN NEW;
END;
$BODY$ LANGUAGE plpgsql VOLATILE;
CREATE TRIGGER ts2_page_title BEFORE INSERT OR UPDATE
ON page FOR EACH ROW EXECUTE PROCEDURE ts2_page_title();
PostgreSQL: промышленная разработка баз данных. Лекция 7

Правила (RULE) и представления (VIEW)
CREATE VIEW myview AS SELECT * FROM mytab;
CREATE TABLE myview(...);
CREATE RULE "_RETURN" AS ON SELECT TO myview
DO INSTEAD
SELECT * FROM mytab;

PostgreSQL: промышленная разработка баз данных. Лекция 7

Литература: 
рекомендации для данной  лекции

PostgreSQL Reference Manual
5.9. Partitioning
● V. Server Programming
Гарсиа­Молина, Г., Ульман, Дж., Уидом, Дж. Системы баз данных. Полный 
курс.

4.5 Объектно­реляционная модель
● 6.7 Виртуальные таблицы
● Глава 7. Ограничения и триггеры
● 8.2 Хранимые процедуры и триггеры
Бартунов О. Что такое PostgreSQL?

PostgreSQL: промышленная разработка баз данных. Лекция 7

Контакты

nikolay@samokhvalov.com

Blog: http://nikolay.samokhvalov.com

XMPP/GTalk: samokhvalov@gmail.com

Skype: samokhvalov & postgresmen

+7 905 783 9804

PostgreSQL: промышленная разработка баз данных. Лекция 7

Sign up to vote on this title
UsefulNot useful