1

我有一个包含多个字段的 SQL 表

身份证 | 价值 | 类型

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

第二行可能是:-

1001,富,[字符串]

第三行可能是:-

1002,10/12/2008,[日期时间]

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

4

2 回答 2

3

恐怖!这是可怕的实体-属性-值 (EAV)模型!逃跑!

但说真的,假设有某种原因需要这种模型,也许为每种数据类型创建一个正确类型的列?

ID       Type      StringValue       DateValue      NumberValue
1001     String    Foo
1002     Date                        10/12/2008
1003     Number                                     123.46
于 2008-11-26T13:10:34.480 回答
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 值相等的行。不过,我还没有对所有场景进行测试,所以你应该尝试一下,看看哪些有效,哪些无效。

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

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

于 2008-11-26T13:21:27.003 回答