我有一个包含多个字段的 SQL 表
身份证 | 价值 | 类型
典型的记录可能是:- 1000,10,[int]
第二行可能是:-
1001,富,[字符串]
第三行可能是:-
1002,10/12/2008,[日期时间]
目前,我被要求查看此内容,每次我们希望从该表中进行选择时,我们都必须将值转换为指定的类型。我能够对此进行数据库重新设计,并且想知道优化它的最佳途径。(SQL 2000)。
我有一个包含多个字段的 SQL 表
身份证 | 价值 | 类型
典型的记录可能是:- 1000,10,[int]
第二行可能是:-
1001,富,[字符串]
第三行可能是:-
1002,10/12/2008,[日期时间]
目前,我被要求查看此内容,每次我们希望从该表中进行选择时,我们都必须将值转换为指定的类型。我能够对此进行数据库重新设计,并且想知道优化它的最佳途径。(SQL 2000)。
恐怖!这是可怕的实体-属性-值 (EAV)模型!逃跑!
但说真的,假设有某种原因需要这种模型,也许为每种数据类型创建一个正确类型的列?
ID Type StringValue DateValue NumberValue
1001 String Foo
1002 Date 10/12/2008
1003 Number 123.46
通常,在设计表格时,您想知道其中实际包含什么。您是否需要支持不同数量的数据类型?你需要覆盖小数吗?一种可能的解决方案是这样的:
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 值相等的行。不过,我还没有对所有场景进行测试,所以你应该尝试一下,看看哪些有效,哪些无效。
不过,我只想再说一遍,您应该再次查看应用程序的设计。您当然可能需要这种功能,但通常当我看到这种设计模式时,前端真正想要的是一个将在应用程序中显示的字符串。该字符串有时恰好看起来像一个数字或日期。如果您实际上要对数据执行数据类型特定的功能,那么可能需要一种不太“灵活”的设计,但在不了解您的所有要求的情况下我不能说。这只是我过去的经验。
编辑:看起来我打字太慢了,托尼打败了我。:)