我有一个包含大量特定列的表,这些列主要是“字符串”。我相信这些名字的硬编码会让我在规则发生变化时感到悲伤。我正在研究使用第二个表的选项,其中每一行都是主表中的一列,每个表都有一个名称的查找键。
我知道这似乎是反ER的最佳实践,但它会很灵活。我可以使用带有子选择的视图,即Table1中的Select(SQL1),(SQL2)等。不确定是否可以在SQLServer中更新多表视图。
对此的想法非常感谢。
谢谢,
版
答案 0 :(得分:3)
听起来你正在寻找的东西就像是Entity-Attribute-Value
(EAV) table.
当涉及到允许进一步定制的灵活性时,EAV允许更加动态的过程,但是差的实现可能意味着它不能很好地遵循关系模型。 This SO question提供了这种解决方案固有的一些问题的良好概述。
重构列以使用较少的特定于上下文的命名约定可能会更好。
答案 1 :(得分:1)
避免使用inner platform effect。 SQL Server已经使您能够查询表中的列。请参阅sys.tables和sys.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';
根据您的问题,您将存储存储在另一列或链接表列中的类型。