【问题标题】:What's the best data type for a 1 character code column in a SQL table?SQL 表中 1 个字符代码列的最佳数据类型是什么?
【发布时间】:2010-09-22 05:38:32
【问题描述】:

这不是主键,而只是在现有系统中用作标记,用 1 个字母代码标记这些项目,即“N”表示新的,“R”表示返回等。我打算使用varchar(50) 作为数据类型,但想知道说 varchar(2) 是否有什么问题,而不是为了提高效率。谢谢!

【问题讨论】:

    标签: sql database-design


    【解决方案1】:

    最好的数据类型是 char(1)。

    varchar 表示variable width,也就是说,如果在 varchar(50) 上只存储 3 个字符,则不会浪费 47 个字节。但是访问它时会产生(小)性能影响,因为它必须检查每行字段的实际长度。

    如果以后需求发生变化,您可以轻松更改表和修改数据类型。

    【讨论】:

      【解决方案2】:

      我认为 char(1) 会很理想

      【讨论】:

        【解决方案3】:

        我只会使用 Char(1)。

        【讨论】:

          【解决方案4】:

          char(1) 如果它总是 1 个字符。

          除非您有充分的理由认为它应该在未来进行扩展 - 即便如此,您也可能希望查看设计并使用 varchar(50) 或其他方式使用查找表的代理键。

          【讨论】:

          • 不要为未来而设计。设计通常很容易改变。如果您将来需要 char(2),只需 ALTER TABLE ;)
          【解决方案5】:

          我同意@Cade Roux - 如果您考虑超过 26 种记录状态的可能性,请考虑将其转换为 FK 到状态表。还让您有机会将其转换为数据驱动的应用程序,例如通过将标签添加到状态表而不是将它们硬编码到应用程序中。

          【讨论】:

            【解决方案6】:

            而且,只是为了混合另一种观点:根据情况,另一种方法是创建一个类型表(“product_status”或类似的东西)的形式:

            CREATE TABLE Product_Status (
                status_id INT NOT NULL PRIMARY KEY, 
                description VARCHAR(50) NOT NULL
            )
            INSERT INTO Product_Status (status_id, description) 
                VALUES (1, 'New')
            INSERT INTO Product_Status (status_id, description) 
                VALUES (2, 'Return')
            --etc.
            

            然后您可以使用原始表中的 int 列通过外键连接到该表。

            ALTER TABLE OriginalTable 
              ADD status_id INT NOT NULL REFERENCES Product_Status(status_id)
            

            这两种方法都有优势。 char(1) 更小,在这种情况下,可能更具可读性,但专门的表可以让您更直观,甚至更易于管理(如果您想稍后添加和删除该字段的可能值)。在这种情况下,我个人会按照人们的建议使用 CHAR(1),但如果它不太明显,这是一条需要考虑的方法。

            无论如何,如果您确实使用了 CHAR(1),最好在其中放置一个列约束以确保非法值不会进入:

            ALTER TABLE OriginalTable ALTER status 
              ADD CONSTRAINT [Check_Valid_Values] 
                CHECK status in ('N', 'R' /* etc ... */)
            

            现在一点点运行时损失可能会在以后避免严重的数据损坏问题。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-10-08
              • 1970-01-01
              相关资源
              最近更新 更多