用户为SQL字段提供的数据类型

时间:2008-11-26 11:52:16

标签: sql sql-server tsql entity-attribute-value

我有一个SQL表,其中包含许多字段

ID |价值|型

典型记录可能是: - 1000,10,[INT]

第二行可能是: -

1001,FOO,[字符串]

第三行可能是: -

1002,10 / 12/2008年,[DATETIME]

此刻我被要求查看此内容,每次我们希望从此表中选择时,我们必须将值转换为指定的类型。我能够对此进行数据库重新设计,并且想知道优化这个的最佳途径。 (SQL 2000)。

2 个答案:

答案 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值相等的行。我没有对所有场景进行测试,所以你应该玩它来看看哪些有效,什么无效。

我再说一遍,你应该再看一下你的应用程序的设计。你当然可能需要这种功能,但是当我看到这个设计模式时,前端真正想要的是一个将在应用程序中显示的字符串。该字符串恰好看起来像一个数字或日期。如果您要在数据上实际执行数据类型特定功能,那么可能需要一个不那么“灵活”的设计,但不知道您不能说出的所有要求。这只是我过去的经历。

编辑:看起来我打字太慢了,托尼打败了我。 :)