Наследование в базе данных?
Есть ли способ использовать наследование в базе данных (в частности, в SQL Server 2005)?
Предположим, у меня есть несколько полей, таких как CreatedOn, CreatedBy, которые я хочу добавить на все мои объекты. Я ищу альтернативный способ вместо добавления этих полей в каждую таблицу.
9 ответов
В SQL Server 2005 нет такой вещи, как наследование между таблицами, и, как отмечали другие, вы можете получить помощь в добавлении необходимых столбцов в таблицы при их создании, но это не будет наследованием, как вы знаю это.
Думайте об этом больше как о шаблоне для ваших файлов исходного кода.
Как упоминает GateKiller, вы можете создать таблицу, содержащую общие данные, и ссылаться на нее с помощью внешнего ключа, но вам придется либо иметь ловушки, триггеры, либо выполнять обновление вручную.
Итог: ручная работа.
PostgreSQL имеет эту функцию. Просто добавьте это в конец определения вашей таблицы:
INHERITS FROM (tablename[, othertable...])
Дочерняя таблица будет иметь все столбцы своего родителя, а изменения родительской таблицы изменят дочернюю таблицу. Кроме того, все в дочерней таблице будет появляться в запросах к родительской таблице (по умолчанию). К сожалению, индексы не пересекают границу родитель / потомок, что также означает, что вы не можете быть уверены, что определенные столбцы уникальны как для родителя, так и для потомка.
Насколько я знаю, эта функция используется не очень часто.
Вы можете создать шаблон на панели шаблонов в Management Studio. И затем используйте этот шаблон каждый раз, когда вы хотите создать новую таблицу.
В противном случае вы можете сохранить поля CreatedOn и CreatedBy в таблице журнала аудита, ссылающейся на исходную таблицу и идентификатор.
В противном случае, сделайте это вручную.
В сопоставлении OR наследование сопоставляется с родительской таблицей, где родительская и дочерняя таблицы используют один и тот же идентификатор
например
create table Object (
Id int NOT NULL --primary key, auto-increment
Name varchar(32)
)
create table SubObject (
Id int NOT NULL --primary key and also foreign key to Object
Description varchar(32)
)
SubObject имеет отношение внешнего ключа к Object. когда вы создаете строку SubObject, вы должны сначала создать строку Object и использовать Id в обеих строках
Рамеш - я бы реализовал это, используя отношения супертипа и подтипа в моей модели ER. Есть несколько различных физических вариантов реализации отношений.
Вы можете использовать инструмент моделирования данных, такой как ER/Studio или ERWin. Оба инструмента имеют столбцы домена, в которых вы можете определить шаблон столбца, который можно применить к любой таблице. Когда домен меняется, изменяются и связанные столбцы. ER/Studio также имеет шаблоны триггеров, которые вы можете создавать и применять к любой таблице. Таким образом мы обновляем наши столбцы LastUpdatedBy и LastUpdatedDate, не создавая и не поддерживая сотни триггерных сценариев.
Если вы создадите таблицу аудита, у вас будет по одной строке для каждой строки в каждой таблице, которая использует таблицу аудита. Это может стать грязным. На мой взгляд, вам лучше размещать столбцы аудита в каждой таблице. Вы также можете разместить столбец отметки времени во всех ваших таблицах. Вы никогда не знаете, когда параллелизм становится проблемой. Наши столбцы аудита БД, которые мы помещаем в каждую таблицу: CreatedDt, LastUpdatedBy, LastUpdatedDt и Timestamp.
Надеюсь это поможет.
У нас есть SProc, который добавляет столбцы аудита в данную таблицу и (необязательно) создает таблицу истории и связанные триггеры для отслеживания изменений в значении. К сожалению, политика компании означает, что я не могу поделиться, но это действительно не трудно достичь.
Если вы используете GUID, вы можете создать таблицу CreateHistory со столбцами GUID, CreatedOn, CreatedBy. Для заполнения таблицы вам все равно придется создать триггер для каждой таблицы или обработать его в логике приложения.
Вы НЕ хотите использовать наследование для этого! Когда таблица B, C и D наследуется от таблицы A, это означает, что запрос таблицы A даст вам записи из B, C и D. Теперь рассмотрим...
УДАЛИТЬ ИЗ А;
Вместо наследования используйте вместо LIKE...
CREATE TABLE blah (
blah_id serial PRIMARY KEY
, something text NOT NULL
, LIKE template_table INCLUDING DEFALUTS
);