После лирического отступления на тему "что работает и что не работает" вернемся собственно к наследованию и его использованию. Будем считать, что все четыре таблицы у нас уже заполнены - файл 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, но там он реализован по другому принципу.