2010-02-17 5 views
5

Ich denke, dass die Fähigkeit mancher reflektionsverwalteter Umgebungen (z. B. .NET), Codeelementen in Form von Attributen benutzerdefinierte Metadaten hinzuzufügen, sehr leistungsfähig ist. Gibt es einen Mechanismus, um etwas ähnliches für Datenbanken zu tun?Benutzerdefinierte/arbiträre Datenbankmetadaten

Datenbanken haben offensichtlich bereits eine beträchtliche Menge an Metadaten zur Verfügung; Sie können beispielsweise eine Liste aller Tabellen, Spalten und Fremdschlüsselreferenzen abrufen, die ausreichen, um ein Schemadiagramm zusammenzustellen. Allerdings konnte ich viel von Anwendungen für etwas mehr generisch, wie etwas entlang der Linien von dieser imaginären Fusion von C# und DDL vorstellen:

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

Das Beispiel ist ein wenig gekünstelt, aber hoffentlich macht meine Frage klarer. Ich denke, dass die Fähigkeit, über diese Art von Metadaten nachzudenken, viele Aufgaben viel einfacher automatisieren könnte. Gibt es so etwas da draußen? Ich arbeite mit SQL Server, aber wenn es etwas für ein anderes DBMS gibt, würde ich immer noch daran interessiert sein, davon zu hören.

Antwort

5

In SQL Server 2005 und höher können Sie sp_addextendedproperty und fn_listextendedproperty (sowie die SSMS-GUI) verwenden, um Beschreibungen zu verschiedenen Datenbankelementen festzulegen und anzuzeigen. Hier finden Sie ein Beispiel für das Festlegen und Anzeigen einer Beschreibung in einer Tabellenspalte:

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

Sie können fast alles mit einem Objekt aus SQL Server herausziehen, wenn Sie wissen, wo Sie suchen müssen. Wenn Sie mehr "Attribute" liefern müssen, erweitern Sie die Problemdomäne mit mehr "Konzepten" und das widerspricht dem KISS-Prinzip - auch eine relationale Datenbank ist offensichtlich perfekt in der Lage, beliebige Beziehungen zu Ihren Daten und dem Beispiel Sie darzustellen habe gezeigt. Ich kann mir keinen Grund vorstellen, warum Sie vom Benutzer bereitgestellte Metadaten zu einer Tabelle hinzufügen möchten.

Wenn Sie jedoch die Notwendigkeit haben, bleiben Sie beim Hinzufügen der zusätzlichen Attribute in einem ORM. Oder erstellen Sie eine separate Tabelle, die die Metadaten für Ihr spezifisches Problem beschreibt. Sie haben auch die Möglichkeit, in Tabellen definierte Funktionen zu verknüpfen, die Sie in C# schreiben können - Sie können daher Ihre Attribute in C# darstellen - noch einmal: Ich halte das für übertrieben.