【问题标题】:datatype supplied by user for SQL field用户为 SQL 字段提供的数据类型
【发布时间】:2008-11-26 11:52:16
【问题描述】:

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

ID |价值 |类型

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

第二行可能是:-

1001,foo,[字符串]

第三行可能是:-

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

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

【问题讨论】:

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


    【解决方案1】:

    恐怖!这是可怕的Entity-Attribute-Value (EAV) 模型!快跑!

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

    ID       Type      StringValue       DateValue      NumberValue
    1001     String    Foo
    1002     Date                        10/12/2008
    1003     Number                                     123.46
    

    【讨论】:

      【解决方案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 值相等的行。不过,我还没有对所有场景进行测试,所以你应该尝试一下,看看哪些有效,哪些无效。

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

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

      【讨论】:

        猜你喜欢
        • 2021-06-06
        • 1970-01-01
        • 1970-01-01
        • 2011-04-22
        • 2010-10-27
        • 1970-01-01
        • 2021-06-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多