Rambler's Top100

(c)2009-2017 openinfotech.ru

СУБД HyTech

Документация
Слияние таблиц

Слияние и объединение таблиц

Правильно спроектированная БД обычно состоит из некоторого количества таблиц, организованных так, чтобы избежать избыточного хранения данных. Например, не имеет смысла хранить в каждой записи о больном название республики, откуда от приехал. Это приведет к многочисленным повторам в записях о больном длинных названий республик. Правильнее разбить данные на две таблицы: таблицу республик (содержащую уникальный короткий код республики и ее название) и таблицу больных (содержащую вместо полного названия республики ее короткий код). Заметьте, что в первой таблице, поле "код республики" является уникальным ключом. А во второй - обычным. При таком подходе избыточность в хранении сведена к минимуму.

Однако, для прикладных задач наверняка потребуется построить "виртуальную" таблицу, содержащую данные о больном и республике, откуда от приехал. Эту операцию можно назвать слиянием таблиц через общий ключ.

В результате слияния будет установлено соответствие записей двух исходных таблиц (образованы пары - запись:запись). В приведенном выше примере таблицы соотносятся через поле "код республики" как ОДИН-МНОГО.

Отношение ОДИН-ОДИН достаточно редко, так как нет необходимости выделять уникальный ключ в отдельную таблицу, если он уже уникальный в текущей.

Отношение МНОГО-МНОГО часто не имеет физического смысла, так как невозможно установить однозначное соответствие между записями таблиц (будут построены все возможные сочетания записей, часть из которых не несет логической нагрузки).

Описанное выше слияние можно распространить на число таблиц, большее двух. При этом структура связи таблиц между собой может быть представлена в виде дерева. Например, связь трех таблиц может иметь вид:

Во втором примере видно, что таблицы B и C связаны между собой через таблицу A. Такую связь можно назвать произведением (число элементов равно произведению размерностей операндов). Обычно такая связь будет представлять собой декартовое произведение (множество всех возможных сочетаний) записей таблиц. Однако, в случае, если связки A-B и A-C являются отношением "ОДИН-МНОГО", то результирующие записи связки будут иметь вид:

A B _
A _ C

где '_' означает "пустое" значение

Пустое значение вместо записи одной из таблиц означает, что в данной связке записей трех таблиц эта запись не имеет логической связи с двумя другими и поэтому не может быть определена. Такую связь назовем "суммой" (число элементов равно сумме размерностей операндов).

Например, если таблица A - описывает клиентов, таблица B - заказы, а таблица C - зарплату, то объединение таблиц может дать:

A B _

- сведения о заказах клиента (ничего не можем сказать о получаемой зарплате - нет связи с зарплатой);

A _ C

- сведения о зарплате (ничего не можем сказать о сделанных заказах - нет связи с заказами);

A B C

- такая запись будет неверной, так как устанавливает несуществующую связь заказов с зарплатой.

Если связь зарплаты с заказами нужна, следует добавить таблицу, определяющую такую связь. Но это уже будет другой связкой таблиц. Связь большего числа таблиц вообще может иметь очень сложный характер. В результате слияния/объединения нескольких таблиц будет установлено соответствие запись-запись..запись для этих таблиц, каждый элемент которого можно рассматривать как "композитную" запись, состоящую их записей исходных таблиц, попавших в соответствие. Порядок расположения записей исходных таблиц в "композитной" записи определяется не только порядком выполнения операций слияния/объединени, но и соображениями эффективности, и может быть определен при помощи вспомогательной функции htTellJoinOrder.