首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编号与Varchar(2)主键

编号与Varchar(2)主键
EN

Stack Overflow用户
提问于 2008-11-27 16:31:28
回答 4查看 14.1K关注 0票数 11

现在我的项目需要设计我的数据库(Oracle)。通常,对于状态和国家表,我不使用数字主键,例如

代码语言:javascript
复制
STATUS (max 6)
AC --> Active
DE --> Deleted

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

这些表是静态的,没有通过应用程序进行更新,也没有预见到将来会发生变化,因此在使用这些值作为外键的表中不可能出现更新问题。

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

所以我的问题是,这些VARCHAR(2)键在查询那里的3个表的联接时会对性能产生影响吗?第一个会比第二个慢得多吗?

代码语言:javascript
复制
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”)。这些值可能是:

代码语言:javascript
复制
* active
* deleted
* draft
* send
* replaced

我们需要向用户显示解码后的值,所以我们需要名称。

EN

回答 4

Stack Overflow用户

发布于 2008-11-27 17:20:17

状态表和国别表都很小,无论是否正式说明,它们实际上都将成为内存。事实上,除了外键通常需要引用的主键字段上的索引之外,您可能会不去理会表上的任何索引。

具有不同类型的联接之间的性能差异将是可以忽略不计的,如果有的话,数值代码会慢一些,因为需要存储更多的数据(但是这些数据都太小了,同样可以忽略不计)。

所以,按照自然规律。除此之外,第一个示例中的SQL更清晰;“UK”和“AC”比1和2更有意义。

在非Oracle DBMS中,您可能会将CHAR(2)用于状态值和国家代码值。Oracle倾向于在所有方面都使用VARCHAR2;我不确定使用CHAR(2)列是否会有损失,特别是因为列值是固定长度的。(例如,在Informix下,一个VARCHAR(2)字段--一个最多两个字符的字段--将存储为3个字节、一个长度(在您的例子中总是为2)和2个数据字节。相反,CHAR(2)字段只占2个字节。

票数 5
EN

Stack Overflow用户

发布于 2008-11-27 17:08:16

看看这个链接。底线是,varchar和num之间的性能差别不大。因此,您应该选择对专栏有意义的内容。在这里,静脉曲张似乎更有意义。

票数 2
EN

Stack Overflow用户

发布于 2008-11-27 16:36:43

如果“状态”是(并且将一直是?)二进制活动/删除字段--为什么要使用表呢?似乎正常化到了一个不切实际的极端。

简单地使用tinyint(1)字段并将活动/删除状态记录为1或0肯定会更快,更不用说更容易了。

这完全消除了你的一个连接,这肯定是件好事。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/324181

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档