2

假设我有一个如下所示的简单表:

CREATE TABLE [dbo].[Product]
(
    ProductID INT -- PK
   ,ProductName NVARCHAR(100)
   ,ProductDescription NVARCHAR(MAX)
   ,ProductOwner NVARCHAR(50)
   -- Extra fields <snip>
)

我希望能够为每一列定义标志[dbo].[Product]并将它们存储在另一个表中。

我可以引入一个FlagType表来定义可能的标志集:

CREATE TABLE [dbo].[FlagType]
(
    FlagTypeID INT -- PK
   ,FlagTypeName NVARCHAR(50)
)

然后是一个Flag提供列、标志类型和值之间映射的表:

CREATE TABLE [dbo].[Flag]
(
    FlagID INT -- PK
   ,FlagTypeID INT -- FK => [dbo].[FlagType] (FlagTypeID)
   ,FlagColumn ??? -- FK
   ,FlagValue BIT
)

我的问题是,如何定义上面列的FK关系FlagColumn,使其必须始终引用数据库中的有效列?

我最初的想法是让它成为一个外键,INFORMATION_SCHEMA.COLUMNS但这个表似乎没有我可以引用的主键。

4

1 回答 1

1

数据库模式和数据不应该真的不知道自己
。也就是说,您的模型和实现不应该需要引用它自己的元数据。

如果你考虑它是没有意义的

一行中的一列存储一个单一的、不可分割的信息位,这些信息对于某些唯一实体(行)具有某些业务意义。该应用程序知道这一点。为列添加“标志”意味着您正在存储有关应用程序应该已经知道的整个列的信息。

但是,如果您坚持,有一种方法:扩展属性。

这就是您将元数据附加到列的方式。但这不是关系一致的

CREATE TABLE dbo.foo (bar int);
GO
EXEC sys.sp_addextendedproperty 'Display Label', 'Barbarella', 'SCHEMA', 'dbo', 'TABLE', 'foo', 'COLUMN', 'bar'
EXEC sys.sp_addextendedproperty 'Display Description', '60s scifi movie starring Jane Fonda', 'SCHEMA', 'dbo', 'TABLE', 'foo', 'COLUMN', 'bar'
GO
SELECT EP.name, EP.value FROM sys.extended_properties EP
       WHERE class=1 AND EP.major_id= OBJECT_ID('dbo.foo') AND 
                EP.minor_id = COLUMNPROPERTY(OBJECT_ID('dbo.foo'), 'bar', 'ColumnID')
GO
于 2013-05-16T08:13:13.940 回答