Пользовательские / произвольные метаданные базы данных


Я думаю, что способность некоторых рефлексивных управляемых сред (например, .NET) добавлять пользовательские метаданные в объекты кода в виде атрибутов очень мощна. Существует ли какой-либо механизм для выполнения чего-то подобного для баз данных?

Очевидно, что базы данных уже имеют достаточное количество доступных метаданных; например, вы можете получить список всех таблиц, столбцов и ссылок на внешние ключи, которого достаточно для построения схемы. Тем не менее, я мог представить себе множество применений для что-то более общее, например, что-то вроде этого воображаемого слияния C# и DDL:
[Obsolete("Being replaced by the ClientInteraction table")]
create table CustomerOrder (

    [SurrogateKey]
    MyTableId int identity(1,1) primary key

    [NaturalKey]
    [ForeignKey("Customer", "CustomerId")] /* Actual constraint left out for speed */
   ,CustomerId int not null

    [NaturalKey]
    [ConsiderAsNull(0)]
    [ConsiderAsNull(-1)]
   ,OrderId int not null

    [Conditional("DEBUG")]
   ,InsertDateTime datetime
)

Пример немного надуман, но, надеюсь, делает мой вопрос более ясным. Я думаю, что способность размышлять над такого рода метаданными может сделать многие задачи гораздо более легко автоматизированными. Есть ли там что-нибудь подобное? Я работаю с SQL Server, но если есть что-то для другой СУБД, то мне все равно было бы интересно услышать об этом.

2 5

2 ответа:

В SQL Server 2005 и выше можно использовать sp_addextendedproperty и fn_listextendedproperty (а также графический интерфейс SSMS) для задания и просмотра описаний различных элементов базы данных. вот пример того, как задать и просмотреть описание столбца таблицы:

--code generated by SSMS to set a description on a table column
DECLARE @v sql_variant 
SET @v = N'your description text goes here'
EXECUTE sp_addextendedproperty N'MS_Description', @v, N'SCHEMA', N'your_schema_name_here', N'TABLE', N'your_table_name_here', N'COLUMN', N'your_column_name_here'


--code to list descriptions for all columns in a table
SELECT * from fn_listextendedproperty (NULL, 'schema', 'your_schema_name_here', 'table', 'your_table_name_here', 'column', default);

Из SQL Server можно извлечь практически все, что связано с объектом, если знать, где искать. Если вам нужно предоставить больше "атрибутов", вы расширяете проблемную область с большим количеством" понятий", и это противоречит принципу KISS-также реляционная база данных, очевидно, идеально подходит для представления любых отношений, связанных с вашими данными и примером, который вы показали. Я не могу придумать причину, по которой вы хотели бы добавить предоставленные пользователем метаданные в таблицу.

Если тем не менее, у вас есть необходимость, придерживайтесь добавления дополнительных атрибутов в ORM. Или создайте отдельную таблицу, которая описывает метаданные для вашей конкретной проблемы. У вас также есть возможность связать в таблице определенные функции, которые вы можете свободно писать в C# - следовательно, вы можете представлять свои атрибуты в C# - снова: я думаю, что это излишне.