当前位置:  开发笔记 > 数据库 > 正文

数字VS Varchar(2)主键

如何解决《数字VSVarchar(2)主键》经验,为你挑选了1个好方法。

我现在对项目的这一点,我需要设计我的数据库(Oracle).通常,对于status和countries表,我不使用数字主键

STATUS (max 6)
AC --> Active
DE --> Deleted

COUNTRIES (total 30)
UK --> United Kingdom
IT --> Italy
GR --> Greece

这些表是静态的,不是通过应用程序更新的,并且预计将来不会进行更改,因此在使用这些值作为外键的表中不会出现更新问题.

该应用程序的主表将使用状态和国家(不止一次,例如来源国,目的地国家),预计每年将增加600000行

所以我的问题是,当查询3个表的连接时,这些VARCHAR(2)键是否会对性能产生影响.第一个会明显慢于第二个吗?

SELECT m.*,
       s.status_name,
       c.country_name
  FROM main m, status s, countries c
 WHERE m.status_cd = s.status_cd
   AND m.country_cd = c.country_cd
   AND m.status_cd = 'AC'
   AND m.country_cd = 'UK'

SELECT m.*,
       s.status_name,
       c.country_name
  FROM main m, status s, countries c
 WHERE m.status_cd = s.status_cd
   AND m.country_cd = c.country_cd
   AND m.status_cd = 1
   AND m.country_cd = 2

澄清:

状态不是二进制(表名旁边的"最大6").值可能是:

* active
* deleted
* draft
* send
* replaced

我们需要向用户显示解码值,因此我们需要名称.



1> Jonathan Lef..:

状态和国家/地区表都非常小,无论是否正式声明,它们都将成为实际存储器.实际上,除了外键通常需要在引用的主键字段上使用索引之外,您可能不想打扰表上的任何索引.

不同类型的连接之间的性能差异可以忽略不计,如果有的话,数字代码会更慢,因为要存储的"更多"数据(但它们都很小,可以忽略不计).

所以,请使用自然代码.除此之外,第一个例子中的SQL更清晰; '英国'和'AC'比1和2更有意义.

在非Oracle DBMS中,您可能会对状态和国家/地区代码值使用CHAR(2).Oracle用户倾向于将VARCHAR2用于所有内容; 我不确定使用CHAR(2)列是否会受到惩罚,特别是因为列值是固定长度.(例如,在Informix下,VARCHAR(2)字段 - 最多两个字符的字段 - 将存储为3个字节,长度(在您的情况下总是2)和2个数据字节.相比之下,CHAR(2) )字段只占用2个字节.)


在Oracle中,CHAR和VARCHAR字段完全相同地存储在磁盘上 - 除了强制将CHAR字段空间填充到指定长度.
推荐阅读
mobiledu2402851377
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有