Наследование в базе данных?

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

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

8.08.2008 10:41:00
Я думаю, что ваш вопрос будет более уместно сформулирован как «Каковы некоторые рекомендуемые способы обработки аудита в базе данных?»
Michael Brown 17.09.2008 19:29:52
Если это единственная цель, я согласен. Но вопрос db-iheritance хорош
Steven A. Lowe 18.09.2008 01:47:01
jpalecek 26.08.2010 12:18:06
9 ОТВЕТОВ
РЕШЕНИЕ

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

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

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

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

3
8.08.2008 11:08:22
старайтесь не ссылаться на другие посты, потому что они вышли из строя из-за голосования.
Michael Brown 17.09.2008 19:28:06

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

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

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

0
8.08.2008 10:43:41
шаблоны не являются наследством
Steven A. Lowe 19.09.2008 04:10:39

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

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

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

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

2
8.08.2008 10:55:20
я думал, что вопрос сказал «конкретно в SQL Server 2005»?
Steven A. Lowe 18.09.2008 01:46:21

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

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

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

0
8.08.2008 12:00:55

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

0
8.08.2008 14:59:43

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

0
20.08.2008 12:23:15
если все, что у вас есть, это GUID, как вы узнаете, из какой таблицы он пришел?
Steven A. Lowe 19.09.2008 04:11:42

Вы НЕ хотите использовать наследование для этого! Когда таблица 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
16.09.2008 05:48:00

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

0
17.09.2008 19:25:58

в сопоставлении 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 в обеих строках

0
17.09.2008 19:48:13