2008-08-08 2 views
8

Можно ли использовать наследование в базе данных (конкретно в SQL Server 2005)?Наследование в базе данных?

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

+0

Я думаю, что ваш вопрос будет более правильно сформулирован как «Какие рекомендуемые способы обработки аудита в базе данных?» –

+0

Если это единственная цель, я согласен. Но вопрос db-iheritance является хорошим. –

+0

Реализовано: http://stackoverflow.com/questions/386652/techniques-for-database-inheritance – jpalecek

ответ

3

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

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

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

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

+0

постарайтесь не ссылаться на другую почту, потому что они выходят из строя из-за голосования. –

1

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

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

Несоблюдение этого, сделайте это вручную.

+0

шаблоны не являются наследованием –

3

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

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

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

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

+0

Я думал, что вопрос сказал «специально в SQL Server 2005», ? –

0

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

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

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

0

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

0

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

+0

если у вас есть GUID, как вы узнаете, из какой таблицы он пришел? –

0

Вы не хотите использовать наследование для этого! Если таблица B, C и D наследуется от таблицы A, это означает, что таблица запросов A даст вам записи из B, C и D. Теперь рассмотрим ...

УДАЛИТЬ ИЗ a;

Вместо наследования, использовать LIKE вместо ...

CREATE TABLE blah (
    blah_id  serial  PRIMARY KEY 
    , something text   NOT NULL 
    , LIKE template_table INCLUDING DEFALUTS 
); 
0

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

0

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

Смежные вопросы