2010-02-17 14 views
5

Creo que la capacidad de algunos entornos gestionados reflectantes (por ejemplo, .NET) para agregar metadatos personalizados a entidades de código en forma de atributos es muy poderosa. ¿Hay algún mecanismo para hacer algo similar para las bases de datos?Metadatos de base de datos personalizados/arbitrarios

Las bases de datos obviamente ya tienen una buena cantidad de metadatos disponibles; por ejemplo, puede obtener una lista de todas las tablas, columnas y referencias de claves externas, que es suficiente para armar un diagrama de esquema. Sin embargo, me puedo imaginar un montón de usos para algo más genérico, como algo en la línea de esta fusión imaginaria de C# y 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 
) 

El ejemplo es un poco artificial, pero espero que mi pregunta hace más clara. Creo que la capacidad de reflexionar sobre este tipo de metadatos podría hacer que muchas tareas se automaticen mucho más fácilmente. ¿Hay algo como esto por ahí? Estoy trabajando con SQL Server, pero si hay algo para otro DBMS, todavía estaría interesado en saberlo.

Respuesta

5

en SQL Server 2005 en adelante puede usar sp_addextendedproperty y fn_listextendedproperty (así como la GUI de SSMS) para establecer y ver descripciones en varios elementos de la base de datos. Aquí hay un ejemplo de cómo establecer y ver una descripción en una columna de la tabla:

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

Puede sacar casi todo lo que tenga que ver con un objeto de SQL Server, si sabe dónde buscar. Si necesita suministrar más "atributos", está ampliando el dominio del problema con más "conceptos" y esto va en contra del principio KISS; también una base de datos relacional es, obviamente, perfecta para representar cualquier relación que tenga que ver con sus datos y el ejemplo que han demostrado. No puedo pensar en una razón por la cual le gustaría agregar metadatos proporcionados por el usuario a una tabla.

Sin embargo, si tiene la necesidad, quédese con agregar los atributos adicionales en un ORM. O cree una tabla separada que describa los metadatos para su problema específico. También tiene la capacidad de vincular en Funciones definidas de tabla que puede escribir libremente en C# - por lo tanto, puede representar sus atributos en C# - nuevamente: Creo que esto es excesivo.

Cuestiones relacionadas