代码之家  ›  专栏  ›  技术社区  ›  anonym0use

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

  •  1
  • anonym0use  · 技术社区  · 17 年前

    我有一个SQL表,它有许多字段

    ID值类型

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

    第二行可以是:

    1001,foo,[字符串]

    第三排可能是:

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

    我被要求查看这个,因为现在,每当我们希望从这个表中选择时,我们都必须将值强制转换为指定的类型。我能够对此进行数据库重新设计,我想知道优化这一点的最佳途径。(SQL 2000)。

    2 回复  |  直到 17 年前
        1
  •  3
  •   Tony Andrews    17 年前

    恐怖!这是可怕的 Entity-Attribute-Value (EAV) 模特!走开!

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

    ID       Type      StringValue       DateValue      NumberValue
    1001     String    Foo
    1002     Date                        10/12/2008
    1003     Number                                     123.46
    
        2
  •  2
  •   Tom H zenazn    17 年前

    通常,在设计表时,您希望知道表中实际包含的内容。您是否有不同数量的数据类型需要支持?你需要覆盖小数吗?一个可能的解决方案是这样的:

    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要求返回的列的所有数据类型都匹配。如果一次只选择一个数据集,它可能会正常工作,但是如果您想选择数据集,那么您可能仍然需要执行一些强制转换,或者只选择数据类型值相等的行。不过,我还没有对所有的场景进行测试,所以您应该仔细研究一下,看看什么有效,什么无效。

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

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