我有一个SQL表,其中包含许多字段
ID |价值|型
典型记录可能是: - 1000,10,[INT]
第二行可能是: -
1001,FOO,[字符串]
第三行可能是: -
1002,10 / 12/2008年,[DATETIME]
此刻我被要求查看此内容,每次我们希望从此表中选择时,我们必须将值转换为指定的类型。我能够对此进行数据库重新设计,并且想知道优化这个的最佳途径。 (SQL 2000)。
答案 0 :(得分:3)
恐怖!这是可怕的Entity-Attribute-Value (EAV)模型!跑开!
但严重的是,假设有一些理由需要这种模型,可能会为每种数据类型创建一个正确类型的列?
ID Type StringValue DateValue NumberValue
1001 String Foo
1002 Date 10/12/2008
1003 Number 123.46
答案 1 :(得分:2)
通常在设计表时,您想知道它们实际上会是什么。您是否需要支持不同数量的数据类型?你需要覆盖小数吗?一种可能的解决方案是这样的:
CREATE TABLE dbo.My_Table (
id INT NOT NULL,
data_type VARCHAR(10) NOT NULL,
string_value VARCHAR(100) NULL,
int_value INT NULL,
date_value DATETIME NULL,
CONSTRAINT CK_My_Table_data_type CHECK data_type IN ('int', 'string', 'datetime'),
CONSTRAINT PK_My_Table PRIMARY KEY CLUSTERED (id)
)
GO
然后,您可以使用数据类型来决定要选择或插入/更新的列。请记住,您可能在使用时遇到问题:
SELECT
id,
CASE data_type
WHEN 'string' THEN string_value
WHEN 'int' THEN int_value
WHEN 'datetime' THEN date_value
ELSE NULL
END
SQL Server要求所有数据类型都匹配要返回的列。如果你一次只选择一个它可能正常工作,但是如果你想要选择数据集,那么你可能还是需要进行一些转换,或者只选择data_type值相等的行。我没有对所有场景进行测试,所以你应该玩它来看看哪些有效,什么无效。
我再说一遍,你应该再看一下你的应用程序的设计。你当然可能需要这种功能,但是当我看到这个设计模式时,前端真正想要的是一个将在应用程序中显示的字符串。该字符串恰好看起来像一个数字或日期。如果您要在数据上实际执行数据类型特定功能,那么可能需要一个不那么“灵活”的设计,但不知道您不能说出的所有要求。这只是我过去的经历。
编辑:看起来我打字太慢了,托尼打败了我。 :)