如何在数据库表中创建通用列?

时间:2012-10-18 23:17:53

标签: sql-server sql-server-2008 entity-framework

我有一个包含大量特定列的表,这些列主要是“字符串”。我相信这些名字的硬编码会让我在规则发生变化时感到悲伤。我正在研究使用第二个表的选项,其中每一行都是主表中的一列,每个表都有一个名称的查找键。

我知道这似乎是反ER的最佳实践,但它会很灵活。我可以使用带有子选择的视图,即Table1中的Select(SQL1),(SQL2)等。不确定是否可以在SQLServer中更新多表视图。

对此的想法非常感谢。

谢谢,

3 个答案:

答案 0 :(得分:3)

听起来你正在寻找的东西就像是Entity-Attribute-Value (EAV) table.

当涉及到允许进一步定制的灵活性时,EAV允许更加动态的过程,但是差的实现可能意味着它不能很好地遵循关系模型。 This SO question提供了这种解决方案固有的一些问题的良好概述。

重构列以使用较少的特定于上下文的命名约定可能会更好。

答案 1 :(得分:1)

避免使用inner platform effect。 SQL Server已经使您能够查询表中的列。请参阅sys.tablessys.columns

使用这些列来查询您拥有的列,并使用标准DDL命令根据需要添加和删除列。不要害怕正常化,加入等。

当您需要做一些在正常设计中无关紧要的事情时,“数据库中的数据库”几乎总是会导致失败。

答案 2 :(得分:1)

您可以将列存储为SQL_VARIANT类型 这不是世界上最好的做法,但你可以使用它。

create table t  (anything sql_variant);
insert t values (current_timestamp);
insert t values (current_timestamp+1);
insert t values (1);
insert t values ('some text');
insert t values (current_timestamp-3);
insert t values (null);
insert t values (2.1234);
insert t values (cast(2 as decimal(10,5)));
insert t values ('some more text');

-- sample based on type
select *
  from t
 where CAST(sql_variant_property(anything, 'BaseType') as varchar(20)) like '%char';

根据您的问题,您将存储存储在另一列或链接表列中的类型。