Вопрос

Есть ли какой-нибудь способ использовать наследование в базе данных (в частности, в SQL Server 2005)?

Предположим, у меня есть несколько полей, подобных Созданный на, Созданный который я хочу добавить ко всем моим объектам.Я ищу альтернативный способ вместо добавления этих полей в каждую таблицу.

Это было полезно?

Решение

В SQL Server 2005 нет такого понятия, как наследование между таблицами, и, как отмечали другие, вы можете получить помощь в добавлении необходимых столбцов в таблицы при их создании, но это не будет наследованием в том виде, в каком вы его знаете.

Думайте об этом скорее как о шаблоне для ваших файлов исходного кода.

Как упоминает GateKiller, вы можете создать таблицу, содержащую общие данные, и ссылаться на нее с помощью внешнего ключа, но вам придется либо использовать перехваты аудита, триггеры, либо выполнять обновление вручную.

Итог:Ручная работа.

Другие советы

В PostgreSQL есть такая функция.Просто добавьте это в конец определения вашей таблицы:

INHERITS FROM (tablename[, othertable...])

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

Насколько я знаю, эта функция используется не очень часто.

Вы можете создать шаблон на панели шаблонов в Management Studio.А затем используйте этот шаблон каждый раз, когда вы хотите создать новую таблицу.

В противном случае вы могли бы сохранить поля CreatedOn и CreatedBy в таблице журнала аудита, ссылающейся на исходную таблицу и идентификатор.

В противном случае сделайте это вручную.

Вы могли бы использовать инструмент моделирования данных, такой как ER / Studio или ERWin.Оба инструмента имеют столбцы домена, в которых вы можете определить шаблон столбца, который можно применить к любой таблице.Когда меняется домен, меняются и связанные столбцы.В ER / Studio также есть шаблоны триггеров, которые вы можете создать и применить к любой таблице.Вот как мы обновляем наши столбцы LastUpdatedBy и LastUpdatedDate без необходимости создавать и поддерживать сотни сценариев запуска.

Если вы создадите таблицу аудита, у вас будет по одной строке для каждой строки в каждой таблице, использующей таблицу аудита.Это может привести к неприятностям.На мой взгляд, вам лучше поместить столбцы аудита в каждую таблицу.Вы также можете захотеть поместить столбец timestamp во все свои таблицы.Вы никогда не знаете, когда параллелизм становится проблемой.Столбцы аудита нашей базы данных, которые мы помещаем в каждую таблицу, следующие:CreatedDt, LastUpdatedBy, LastUpdatedDt и временная метка.

Надеюсь, это поможет.

У нас есть 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
);

Рамеш - Я бы реализовал это, используя отношения супертипов и подтипов в моей модели E-R.У вас также есть несколько различных физических вариантов реализации этих взаимосвязей.

при отображении O-R наследование сопоставляется родительской таблице, где родительская и дочерняя таблицы используют один и тот же идентификатор

например

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)
)

ПодОбъект имеет отношение к объекту по внешнему ключу.когда вы создаете строку подобъекта, вы должны сначала создать строку объекта и использовать идентификатор в обеих строках

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top