VARCHAR作为数据库中的外键/主键好坏?

33 mysql sql database indexing search

如果我使用ID nr:s而不是VARCHARS作为外键,这样会更好吗?是否更好地使用ID nr:s而不是VARCHARS作为主键?ID ID我的意思是INT!

这就是我现在拥有的:

category table:
cat_id ( INT ) (PK)
cat_name (VARCHAR)

category options table:
option_id ( INT ) (PK)
car_id ( INT ) (FK)
option_name ( VARCHAR ) 
Run Code Online (Sandbox Code Playgroud)

我可能有这个我认为:

category table:
cat_name (VARCHAR) (PK)

category options table:
cat_name ( VARCHAR ) (FK)
option_name ( VARCHAR ) ( PK )
Run Code Online (Sandbox Code Playgroud)

或者我在这里想错了?

Arm*_*est 30

VARCHAR用于任何KEY的问题在于它们可以容纳WHITE SPACE.白色空间由任何非屏幕可读的字符,如空格跳格,回车等使用VARCHAR作为重点可以让你的生活困难,当你开始追捕为什么表不会在最后回国与多余的空格记录他们的钥匙.

当然,你CAN使用VARCHAR,但你必须要非常小心的输入和输出.它们也占用更多空间,在进行查询时可能会更慢.

整数类型有一个包含10个有效字符的小列表,0,1,2,3,4,5,6,7,8,9.它们是用作密钥的更好的解决方案.

你总是可以使用基于整数的键,并使用VARCHAR作为一个独特的价值,如果你想拥有更快的查找速度的优势.

  • @Tony:立即可读的数据通常意味着非规范化数据. (11认同)
  • 但是数字标识符的问题是它们难以阅读,并且在查看数据时总是需要连接到其他表以获取其含义.想象一个表将三个(或更多)其他表与所有ID作为整数相关联?你有三列数字没有直接意义. (7认同)
  • @OMG小马:我理解你的观点,但并不总是立即表明非规范化数据.在示例@astander给出(证券交易所公司代码)中,为公司使用CHAR密钥是完全合理的.它们都是独特的,但也非常易读. (4认同)
  • 这里没什么随机的.股票代码的变化并非闻所未闻(SUN - > JAVA).同一家公司,如何处理这个?独特 - 没有.不是你获得国际化的那一刻.或者不仅使用股票,还使用其他金融工具.股票代码 - 哪一个?有多种符号(路透社等),具有标准化(但不同)的代码. (4认同)
  • -1. 你的倒数第二句话要么不正确,要么**非常**误导。整数类型中的“字符”对数据库没有任何意义,它只是字节值的直观表示。INT 与 VARCHAR(4) 一样快,而 BIGINT 与 VARCHAR(8) 一样快(假设所有字符的长度都是一个字节)。 (3认同)
  • @托尼 我知道您的意思,但是,这就是前端的用途。它们用于读取数据。创建数据库结构可能是为了提高效率,易于维护,鲁棒性和可伸缩性。如果在开发时需要使用某些快速视图,则可以提高可读性。尽管在任何大型数据库中都为每个密钥赋予一个可读的名称可能很诱人,但是您最终会遇到尝试使每个密钥可读的问题。并非所有可以做的事情都应该做。 (2认同)
  • @Atomiton:是的,前端是为了让事情变得更容易,但是你能否诚实地说你已经通过除了数据库提供的前端之外的前端解决了所有数据库问题?:) (2认同)

jrv*_*tti 12

我的2美分:

从性能角度来看,使用CHAR或VARCHAR作为主键或索引是一场噩梦.

我测试了复合主键(INT + CHAR,INT + VARCHAR,INT + INT),到目前为止INT + INT是最佳性能(加载数据仓库).如果只保留数字主键/索引,可以说大约两倍的性能.


Bob*_*ica 11

当我在进行设计工作时,我会问自己:我能否保证这些数据中的任何内容都是非NULL,唯一且不变的?如果是这样,那么候选人就成了主键.如果没有,我知道我必须生成一个要使用的键值.那么,假设我的候选键恰好是VARCHAR,那么我会查看数据.它的长度是否相当短(意思是说,20个字符或更少)?或者VARCHAR字段是否相当长?如果它很短,那么它可用作一个键 - 如果它很长,也许最好不要将它用作一个键(尽管如果考虑到它是主键,我可能不得不索引它).至少我担心的一部分是主键必须被索引,并且可能被用作来自其他表的外键.VARCHAR字段的比较往往比数字字段(特别是二进制数字字段,如整数)的比较慢,因此使用长VARCHAR字段作为键可能会导致性能降低.因人而异.