动态表列

时间:2010-06-01 12:35:58

标签: c# .net database database-design

我有一个场景,用户可以在其中定义列,也可以是主表。此主表具有事务表,其ref为其主键,并且还有一些公共列,其值对于每个记录都不同。

实施例, 用户创建了名为XYZ的表,并定义了列X1,X2,X3等。并且Transaction表作为Tran_XYZ并且它包含对XYZ的ref以及列X1,X2,X3,其值在此处被覆盖。

我需要在asp.net中实现这个动态列,请告诉我最好的技术和方法。

1 个答案:

答案 0 :(得分:1)

嗯,我不确定我对你应该做什么有一个很好的答案,但我建议不要让你的应用程序使用DDL动态创建数据库中的实际表。不是说永远不应该这样做,但我会说99%的时间可能不是一个好主意。

事务表是否也是动态创建的?该事务表中的所有记录是否与用户正在创建的主表相关,或者该事务表中的某些记录是否与其他用户创建的其他主表相关?

如果只有一个事务表需要引用多个用户定义的主表,那么我会考虑使用一个核心事务表,它没有任何列引用这些用户定义的主表。然后我会有一个与该事务表的1对1或1对多关系的另一个表,该表具有对相应主表的引用。

正如我上面提到的,我会考虑不在数据库中创建实际表来表示用户定义的主表。我会考虑使用SQL Server 2005或更高版本的方法:

编辑:修正我的格式。

-- this table identifies the user-defined master tables
create table UserDefinedMasterType (
  MasterTypeID int not null,
  MasterTypeName varchar(50) not null

  -- primary key on MasterTypeID
)

-- this table stores the data for each user-defined master table
-- each record is uniquely identified by the MasterTypeID and MasterDataID
create table UserDefinedMasterData (
  MasterTypeID int not null,
  MasterDataID int not null,
  Data xml not null

  -- primary key on MasterTypeID and MasterDataID
  -- foreign key on MasterTypeID to UserDefinedMasterType.MasterTypeID
)

- this is the core transactional table that does not contain any references to user-defined master data
create table TransactionalData (
  TransactionID int not null primary key,
  -- other transactional columns,
)

-- this is a table related to the core transactional table that also contains references to the user-defined master table
create table TransactionalUserDefinedData (
  TransactionID int not null,
  MasterTypeID int not null,
  MasterDataID int not null,  
  Data xml,

  -- primary key on TransactionID and MasterTypeID
  -- foreign key on TransactionID to TransactionalData.TransactionID
  -- foreign key on MasterTypeID and MasterDataID to UserDefinedMasterData.MasterTypeID and UserDefinedMasterData.MasterDataID
)

因此TransactionalUserDefinedData表与TransactionalData表是一对多关系,TransactionalData表是核心事务表。 TransactionalUserDefinedData将事务记录与0,1或更多用户定义的主表相关联。 UserDefinedMasterData表和TransactionalUserDefinedData表上的XML列允许您动态指定数据的“列”。

我将TransactionalUserDefinedData表中的Data列保留为nullable,认为该列中的空值表示主表中的数据未被覆盖,并且该表中的数据应该用于此记录。

如果您不希望允许事务记录与我的示例中的多个用户定义的主表相关,那么您可以将TransactionalUserDefinedData表上的主键更改为仅TransactionID列,这会更改表与TransactionalData列的关系,从1到多对1到1,或者只是将TransactionalUserDefinedData表中的列移动到TransactionalData表中。