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

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

Embed Size (px)

Citation preview

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

PostgreSQL: промышленнаяразработка баз данных

Лекция 7

Реализация мехазма наследования таблиц в PostgreSQL.

Хранимые процедуры. Триггеры и правила (RULE)

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

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

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

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

Наследование классов и объектное поведение

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

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

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

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

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

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

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;

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

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

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

obj

obj_id      INT8obj_status_did INT8obj_creator_obj_id INT8obj_created TIMESTAMPobj_modified TIMESTAMPobj_commented TIMESTAMPobj_marks_count INT4obj_marks_rating FLOAT8obj_tsvector tsvector

user

group

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

}­ NOT NULL DEFAULT CURRENT_TIMESTAMP

— Почти везде нужен полнотекст.

}- оцениваем всё!

comment

comment_author_obj_idcomment_text

comment

comment_text

user2obj

u2o_user_obj_idu2o_obj_obj_idu2o_marku2o_is_favorite

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

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);...

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

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

Партицирование таблиц

CREATE RULE measurement_insert_yy04mm02 ASON 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)

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

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

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

Физически данные хранятся только в одной таблице (как правило, дочерней)

Индексы необходимо создавать для таблиц, где данные хранятся физически

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

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

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

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

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

● SQL

● PL/pgSQL

● PL/Perl

● PL/Tcl

● PL/Python

● PL/R

● PL/Java

● plPHP

● plRuby

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

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

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

Функции: SQL

CREATE OR REPLACE FUNCTION hello(text)RETURNS textAS $BODY$    SELECT 'Hello ' || $1 || '!';$BODY$ LANGUAGE sql IMMUTABLE;

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

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

Функции: PL/pgSQL

CREATE OR REPLACE FUNCTION hello(text)RETURNS textAS $BODY$BEGIN    RETURN 'Hello ' || $1 || '!';END;$BODY$ LANGUAGE plpgsql IMMUTABLE;

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

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

Триггеры

CREATE OR REPLACE FUNCTION ts2_page_title()RETURNS "trigger"AS $BODY$BEGIN

IF TG_OP = 'INSERT' THENNEW.titlevector = to_tsvector('default',NEW.page_title);

ELSIF NEW.page_title <> OLD.page_title THENNEW.titlevector := to_tsvector('default',NEW.page_title);

END IF;RETURN NEW;END;$BODY$ LANGUAGE plpgsql VOLATILE;

CREATE TRIGGER ts2_page_title BEFORE INSERT OR UPDATEON page FOR EACH ROW EXECUTE PROCEDURE ts2_page_title();

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

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

Правила (RULE) и представления (VIEW)

CREATE VIEW myview AS SELECT * FROM mytab;

CREATE TABLE myview(...);CREATE RULE "_RETURN" AS ON SELECT TO myview

DO INSTEADSELECT * FROM mytab;

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

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

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

● PostgreSQL Reference Manual

● 5.9. Partitioning● V. Server Programming

● Гарсиа­Молина, Г., Ульман, Дж., Уидом, Дж. Системы баз данных. Полный курс.

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

● Бартунов О. Что такое PostgreSQL?

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

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

Контакты

[email protected]

● Blog: http://nikolay.samokhvalov.com

● XMPP/GTalk: [email protected]

● Skype: samokhvalov & postgresmen

● +7 905 783 9804