Наследование в базе данных? - PullRequest
8 голосов
/ 08 августа 2008

Есть ли способ использовать наследование в базе данных (особенно в SQL Server 2005)?

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

Ответы [ 9 ]

2 голосов
/ 08 августа 2008

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

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

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

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

2 голосов
/ 08 августа 2008

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

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

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

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

0 голосов
/ 17 сентября 2008

в отображении 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)
)

SubObject имеет отношение внешнего ключа к Object. когда вы создаете строку SubObject, вы должны сначала создать строку Object и использовать Id в обеих строках

0 голосов
/ 17 сентября 2008

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

0 голосов
/ 16 сентября 2008

Вы НЕ хотите использовать наследование для этого! Когда таблица 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
);
0 голосов
/ 20 августа 2008

Если вы используете GUID, вы можете создать таблицу CreateHistory со столбцами GUID, CreatedOn, CreatedBy. Для заполнения таблицы вам все равно придется создать триггер для каждой таблицы или обработать его в логике приложения.

0 голосов
/ 08 августа 2008

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

0 голосов
/ 08 августа 2008

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

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

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

0 голосов
/ 08 августа 2008

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...