Upload
nikolay-samokhvalov
View
1.052
Download
0
Embed Size (px)
Citation preview
PostgreSQL: промышленнаяразработка баз данных
Лекция 7
Реализация мехазма наследования таблиц в PostgreSQL.
Хранимые процедуры. Триггеры и правила (RULE)
PostgreSQL: промышленная разработка баз данных. Лекция 7
Объектнореляционная СУБД
От управления данными — к управлению объектами и знаниями
Наследование классов и объектное поведение
В 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 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
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 '20040201' AND logdate < DATE '20040301' )) INHERITS (measurement);
CREATE TABLE measurement_yy04mm03 ( CHECK ( logdate >= DATE '20040301' AND logdate < DATE '20040401' )) INHERITS (measurement);...
PostgreSQL: промышленная разработка баз данных. Лекция 7
Партицирование таблиц
CREATE RULE measurement_insert_yy04mm02 ASON INSERT TO measurement WHERE ( logdate >= DATE '20040201' AND logdate < DATE '20040301' )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 '20060101'; 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 >= '20060101'::date) > Seq Scan on measurement_yy06mm01 measurement (cost=0.00..30.38 rows=543 width=0) Filter: (logdate >= '20060101'::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 textAS $BODY$ SELECT 'Hello ' || $1 || '!';$BODY$ LANGUAGE sql IMMUTABLE;
PostgreSQL: промышленная разработка баз данных. Лекция 7
Функции: PL/pgSQL
CREATE OR REPLACE FUNCTION hello(text)RETURNS textAS $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' 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();
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;
PostgreSQL: промышленная разработка баз данных. Лекция 7
Литература: рекомендации для данной лекции
● PostgreSQL Reference Manual
● 5.9. Partitioning● V. Server Programming
● ГарсиаМолина, Г., Ульман, Дж., Уидом, Дж. Системы баз данных. Полный курс.
● 4.5 Объектнореляционная модель● 6.7 Виртуальные таблицы● Глава 7. Ограничения и триггеры● 8.2 Хранимые процедуры и триггеры
● Бартунов О. Что такое PostgreSQL?
PostgreSQL: промышленная разработка баз данных. Лекция 7
Контакты
● Blog: http://nikolay.samokhvalov.com
● XMPP/GTalk: [email protected]
● Skype: samokhvalov & postgresmen
● +7 905 783 9804