Открыть Электронные книги
Категории
Открыть Аудиокниги
Категории
Открыть Журналы
Категории
Открыть Документы
Категории
разработка баз данных
Лекция 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
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 '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 AS
ON 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 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