【发布时间】:2010-09-22 05:38:32
【问题描述】:
这不是主键,而只是在现有系统中用作标记,用 1 个字母代码标记这些项目,即“N”表示新的,“R”表示返回等。我打算使用varchar(50) 作为数据类型,但想知道说 varchar(2) 是否有什么问题,而不是为了提高效率。谢谢!
【问题讨论】:
标签: sql database-design
这不是主键,而只是在现有系统中用作标记,用 1 个字母代码标记这些项目,即“N”表示新的,“R”表示返回等。我打算使用varchar(50) 作为数据类型,但想知道说 varchar(2) 是否有什么问题,而不是为了提高效率。谢谢!
【问题讨论】:
标签: sql database-design
最好的数据类型是 char(1)。
varchar 表示variable width,也就是说,如果在 varchar(50) 上只存储 3 个字符,则不会浪费 47 个字节。但是访问它时会产生(小)性能影响,因为它必须检查每行字段的实际长度。
如果以后需求发生变化,您可以轻松更改表和修改数据类型。
【讨论】:
我认为 char(1) 会很理想
【讨论】:
我只会使用 Char(1)。
【讨论】:
char(1) 如果它总是 1 个字符。
除非您有充分的理由认为它应该在未来进行扩展 - 即便如此,您也可能希望查看设计并使用 varchar(50) 或其他方式使用查找表的代理键。
【讨论】:
我同意@Cade Roux - 如果您考虑超过 26 种记录状态的可能性,请考虑将其转换为 FK 到状态表。还让您有机会将其转换为数据驱动的应用程序,例如通过将标签添加到状态表而不是将它们硬编码到应用程序中。
【讨论】:
而且,只是为了混合另一种观点:根据情况,另一种方法是创建一个类型表(“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 ... */)
现在一点点运行时损失可能会在以后避免严重的数据损坏问题。
【讨论】: