我认为某些反思托管环境(例如.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,但如果有其他DBMS的东西,那么我仍然有兴趣听到它。
答案 0 :(得分:5)
在SQL Server 2005及更高版本中,您可以使用sp_addextendedproperty
和fn_listextendedproperty
(以及SSMS gui)来设置和查看各种数据库项的描述。以下是如何在表列上设置和查看描述的示例:
--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);
答案 1 :(得分:0)
如果您知道要查找的位置,您几乎可以从SQL Server中提取任何与对象有关的内容。如果您需要提供更多“属性”,那么您正在使用更多“概念”来扩展问题域,这违背了KISS原则 - 关系数据库显然也能完美地表示与您的数据和示例有关的任何关系已经表明。我想不出你想要将用户提供的元数据添加到表中的原因。
但是,如果您有需要,请坚持在ORM中添加其他属性。或者创建一个单独的表来描述特定问题的元数据。您还可以在C#中自由编写表格定义函数中的链接 - 因此您可以在C#中表示您的属性 - 再次:我认为这有点矫枉过正。