OSS Group OSS Group
>  Карта
>  Поиск
>  Контакты
>  OSS Group  ::  Admin  ::  Наследование таблиц в PostgreSQL
  
РегистрацияЗабыли пароль?

↓  Быстрый поиск по Wiki


Режим поиска:   И   ИЛИ

↓  Доступные Wiki

↓  Навигация по сайту

[]

↓  Последняя новость

Загрузка...

↓  На эту страницу ссылаются:

Get Firefox!
[~]

Наследование таблиц в PostgreSQL

Использование наследования таблиц в PostgreSQL

Создание таблицы - наследника:
CREATE TABLE child INHERITS parent;

IMHO, использование наследования таблиц имеет смысл в случае, когда

  • есть несколько наборов данных, имеющих общие поля, и часто требуется проведение выборок по общим полям этих наборов. Прямой путь - создание нескольких таблиц, общие поля в которых одинаково именуются, и проведение общих выборок с использованием UNION. Второй путь - наследование.
  • необходимо использование ссылок на разные по структуре наборы данных, через один FOREIGN KEY.<sup>*</sup>

<sup>*</sup> 2004-01-02: см. PostgreSQL Documentation, p. 2.5 Inheritance:

 A limitation of the inheritance feature is that indexes (including unique constraints) and foreign key constraints only apply to single tables,
not to their inheritance children. Thus, in the above example, specifying that another table's column REFERENCES cities(name)  would allow
the other table to contain city names but not capital names. This deficiency will probably be fixed in some future release.

Как временное решение (до разрешения проблемы): вместо REFERENCES делать CHECK, и проверять наличие ключа в таблице-родителе. Это обеспечивает целостность базы при условии постоянства значений PRIMARY KEY таблицы-родителе.


Согласно выводу EXPLAIN, в базе наследники храняться как _отдельные_ таблицы, выборки по наследникам идут по одной таблице, а по родителям - по родительской таблице + таблцицы наследников (т.е. через некий встроенный UNION).

1. Создание таблиц:

CREATE TABLE base (
	id    SERIAL PRIMARY KEY,
	txt   TEXT,
	type  CHAR(5) NOT NULL DEFAULT 'base'
	);

CREATE TABLE base_t (
	foo_t  TEXT
	)
	INHERITS (base);
ALTER TABLE base_t ALTER COLUMN type SET DEFAULT 'text';
CREATE TABLE base_i (
	foo_i  INTEGER
	)
	INHERITS (base);
ALTER TABLE base_i ADD PRIMARY KEY (id);
ALTER TABLE base_i ALTER COLUMN type SET DEFAULT 'int';
CREATE TABLE base_b (
	foo_b  BOOLEAN
	)
	INHERITS (base);
ALTER TABLE base_b ALTER COLUMN type SET DEFAULT 'bool';

2. Структура таблиц:

naf=# \d base_t
                            Таблица "public.base_t"
 Колонка |     Тип      |                     Модификаторы
---------+--------------+------------------------------------------------------
 id      | integer      | not null default nextval('public.base_id_seq'::text)
 txt     | text         |
 type    | character(5) | not null default 'text'
 foo_t   | text         |

3. Наполнение таблиц:

INSERT INTO base (txt) VALUES ('Base table - 1');
INSERT INTO base (txt) VALUES ('Base table - 2');
INSERT INTO base (txt) VALUES ('Base table - 3');
INSERT INTO base_t (txt,foo_t) VALUES ('Foo_t table - 1','Foo - 1');
INSERT INTO base_t (txt,foo_t) VALUES ('Foo_t table - 2','Foo - 2');
INSERT INTO base_t (txt,foo_t) VALUES ('Foo_t table - 3','Foo - 3');
INSERT INTO base_t (txt,foo_t) VALUES ('Foo_t table - 4','Foo - 4');
INSERT INTO base_i (txt,foo_i) VALUES ('Foo_i table - 1',1);
INSERT INTO base_i (txt,foo_i) VALUES ('Foo_i table - 2',2);
INSERT INTO base_i (txt,foo_i) VALUES ('Foo_i table - 3',3);
INSERT INTO base_b (txt,foo_b) VALUES ('Foo_b table - 1',True);
INSERT INTO base_b (txt,foo_b) VALUES ('Foo_b table - 2',False);

4. Выборки:

naf=# SELECT * FROM base;
 id |       txt       | type
----+-----------------+-------
  1 | Base table - 1  | base
  2 | Base table - 2  | base
  3 | Base table - 3  | base
  4 | Foo_t table - 1 | text
  5 | Foo_t table - 2 | text
  6 | Foo_t table - 3 | text
  7 | Foo_t table - 4 | text
  8 | Foo_i table - 1 | int
  9 | Foo_i table - 2 | int
 10 | Foo_i table - 3 | int
 11 | Foo_b table - 1 | bool
 12 | Foo_b table - 2 | bool
(записей: 12)

naf=# SELECT * FROM base_t;
 id |       txt       | type  |  foo_t
----+-----------------+-------+---------
  4 | Foo_t table - 1 | text  | Foo - 1
  5 | Foo_t table - 2 | text  | Foo - 2
  6 | Foo_t table - 3 | text  | Foo - 3
  7 | Foo_t table - 4 | text  | Foo - 4
(записей: 4)

Дата создания: 2006-05-24 12:51:53 (Фетисов Н. А. (naf))
Последнее изменение: 2006-05-24 12:51:53 (Фетисов Н. А. (naf))
Владелец: Фетисов Н. А. (naf)
Версия: 1


  Не показывать комментарии



Wiki::Admin   Оглавление  Карта раздела  Изменения за сутки  Изменения за неделю  Изменения за месяц



Valid XHTML 1.0 Transitional  Valid CSS!  [Valid RSS]