You are on page 1of 14

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      INT8 — «Сквозной» ID


obj_status_did INT8 — Значение из справочника
obj_creator_obj_id INT8 — ID создателя (если применимо)
obj_created TIMESTAMP
obj_modified
obj_commented
TIMESTAMP
TIMESTAMP }­ 
NOT NULL DEFAULT CURRENT_TIMESTAMP
obj_marks_count INT4
obj_marks_rating FLOAT8 }- оцениваем всё!
obj_tsvector tsvector
— Почти везде нужен полнотекст.

user2obj
group
u2o_user_obj_id comment
u2o_obj_obj_id
u2o_mark user comment_author_obj_id
u2o_is_favorite comment_text

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

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

You might also like