После лирического отступления на тему "что работает и что не работает" вернемся собственно к наследованию и его использованию. Будем считать, что все четыре таблицы у нас уже заполнены - файл test.sql
служит именно для этой цели; он создаст БД, с которой мы и будем работать (просьба вернуть ему изначальное расширение .sql
).
В случае, если мы будем делать выборки из таблиц-потомков, то наследование не даст нам никаких принципиально новых результатов. Однако, если применять оператор SELECT к родительской для всех остальных таблице dvd
, то все становится несколько интереснее.
SELECT * FROM dvd
Вот что выдается:
Результат | |||
---|---|---|---|
1 | Philips | DVP-3148K | р.1 599,00 |
2 | Supra | DVS-120X | р.899,00 |
3 | Daewoo | DNS-5800 | р.1 199,00 |
1 | Elenberg | HT-111 | р.2 399,00 |
2 | Daewoo | HC-4250XS | р.2 999,00 |
3 | Samsung | HT-Z110R | р.4 199,00 |
4 | LG | LH-T3530X | р.5 499,00 |
1 | BBK | DL370SI | р.2 999,00 |
2 | Daewoo | DPC-8209PD | р.2 999,00 |
3 | Elenberg | LD-715 | р.3 199,00 |
1 | Cameron | CA-575 DVD | р.4 599,00 |
2 | Elenberg | MX-390DVD | р.2 499,00 |
Просили одно, а получили сразу все - и саму таблицу dvd
и заодно всех её потомков.
Снова беремся за руководство. Оказывается, есть модификатор ONLY
, который заставляет СУБД принимать во внимание только саму таблицу и игнорировать какое-то от неё наследование.
SELECT * FROM ONLY dvd
Вот что выдается:
Результат | |||
---|---|---|---|
1 | Philips | DVP-3148K | р.1 599,00 |
2 | Supra | DVS-120X | р.899,00 |
3 | Daewoo | DNS-5800 | р.1 199,00 |
До версии 7.1 по умолчанию наследование не применялось при обработке запросов. Однако потом такое поведение СУБД было признано несоответствующим стандарту и было исправлено, теперь при необходимости игнорировать таблицы-потомки указание ключевого слова ONLY
обязательно.
Вложение | Размер |
---|---|
test.sql_.txt | 4.58 kb |
Комментарии
В документации
В документации PostgreSQL описано, что наследование также можно применять для увеличения быстродействия при работе с таблицами, которые содержат очень много строк.
Например если есть таблица, которая хранит какие-либо данные по годам и этих данных много (сотни тысяч и миллионы записей), то проще создать несколько таблица, каждая из которых будет хранить данные за свой год и одну таблицу, которая будет связана с этими таблицами наследованием. К сожалению при этом придётся писать триггеры для удаления, вставки и обновления записей, но когда быстродействие критично - это оправдано, потому что выборка из одной таблицы будет всё-таки ощутимо медленней, чем в описанном случае.
Это partitioning. Про
Это partitioning. Про него я ещё расскажу подробно.
Я использовал его в MySQL, но там он реализован по другому принципу.