Особенности хранения полиморфных ссылок в базе данныхКлассическая реляционная модель не предусматривает хранения в одной колонке ссылок на различные другие таблицы. Рассмотрим, какие выходы предусмотрены в различных СУБД и в 1С. | | Автор статьи: Гений 1С | Редакторы: Последняя редакция №3 от 29.08.06 | История URL: http://kb.mista.ru/article.php?id=354 | |
Ключевые слова: ссылки,внешний ключ,foreighn key,схема данных
Рассмотрим простой вариант - в таблице накладных Nakl должна быть ссылка Client, которая может ссылаться на таблицу Persons(физические лица) или на таблицу Organizations(контрагенты).
Типы ключей в Persons и Organizations одинаковые.
Как можно решить эту задачу?
Ключ объекта и номер варианта
В таблицу Nakl вводится дополнительное числовое поле Variant, которое определяет, из какой таблицы берется значение.
Например, 1 означает, что поле ссылается на Persons, 2 - на Organizations.
Ключ объекта и ключ таблицы
Является универсальным следствием предыдущего метода.
Заводится таблица Tables, содержащая список всех таблиц базы данных.
В таблицу Nakl вводится дополнительное поле Client_T, которое указывает на таблицу из Tables и таким образом определяет, из какой таблицы берется значение.
Составной ключ
Этот метод применяется в 1С 77.
Для ссылки используется составной ключ, первая часть которого указывает таблицу из Tables, а вторая - ссылку на объект в этой таблице. Но этот ключ хранится в одном поле.
Преимущество в том, что не требуются дополнительные поля, хотя размер ключа увеличивается.
Сквозная нумерация
В базе существует таблица Objects с полями ID, Table.
Каждый объект при добавлению в базу получает ID из этой таблицы.
По полю Table можно определить, где хранится объект.
Изменение схемы данных
Данная задача может быть решена с помощью нормализации схемы данных.
Вводится дополнительная таблица Contragents.
У каждого объекта Persons и Organizations добавляется поле Contragent, ссылающееся на запись из Contragents, вид отношения один к одному.
Тогда в поле Client таблицы Nakl используется ссылка на таблицу Contragent.
Однако нормализация всей базы - процесс достаточно трудоемкий и порой проигрышный по скорости и объему данных.
Особенности 1С1С77
У каждого объекта (элемента справочника, документа, счета) используется текстовый ключ, первая часть которого определяет код таблицы, а вторая - ссылка на объект внутри таблицы.
1C80
Для ссылки на объект используется GUID. Я правда не знаю, шифруется ли в этом GUID ссылка на конкретный объект? Просветите.
|