表只有一列或添加数字主键?

时间:2012-12-07 10:56:50

标签: mysql database database-design schema

假设我需要一个包含帐号ID的简单表,而不需要其他信息。有两种方法可以做到:

id varchar(255) PRIMARY KEY

或者添加数字主键:

id int PRIMARY KEY
accountId varchar(255) UNIQUE NOT NULL

这两种方法有哪些优点/缺点,您可以选择哪种方法?为什么?

第一个解决方案对可维护性有什么影响(如果我们需要更改单行的id)和性能?

3 个答案:

答案 0 :(得分:9)

这归结为数据库世界中代理键自然键的争论。有关该主题的文字,请参阅hereherehere。我认为这两个选项都是有效的,但在这种情况下,我会选择AccountID作为自然键(假设AccountID对每个帐户都是唯一的,不会为空,并且不会受到变化),因为它意味着更少的开销。在这种情况下,我没有看到代理键的附加价值。

自然键:

  • 对用户有意义
  • 在需要时很难改变
  • 可能会导致查询中需要更少的联接

代理键:

  • 对用户没有任何意义
  • 不受更改
  • 可能会导致在查询中需要更多联接
  • 可能需要额外或更大的索引

答案 1 :(得分:2)

不同之处在于PRIMARY KEY约束意味着/强制执行NOT NULL CONSTRAINT。在第一个示例中,varchar(255)将有效地提升为varchar(255) NOT NULL

DROP SCHEMA tmp CASCADE;
CREATE SCHEMA tmp ;
SET search_path=tmp;

CREATE TABLE pk
        ( id varchar(255) PRIMARY KEY
        );

CREATE TABLE uniq
        ( id int PRIMARY KEY
        , accountid varchar(255) UNIQUE
        );

INSERT INTO pk (id) VALUES(NULL);
INSERT INTO uniq (id, accountid) VALUES(1, NULL);

结果:

DROP SCHEMA
CREATE SCHEMA
SET
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "pk_pkey" for table "pk"
CREATE TABLE
NOTICE:  CREATE TABLE / PRIMARY KEY will create implicit index "uniq_pkey" for table "uniq"
NOTICE:  CREATE TABLE / UNIQUE will create implicit index "uniq_accountid_key" for table "uniq"
CREATE TABLE
ERROR:  null value in column "id" violates not-null constraint
INSERT 0 1

由于PK( - >> NOT NULL)约束,第一个插入失败;第二个成功。

答案 2 :(得分:1)

如果该列的内容是唯一的(似乎是ID的情况),那么继续将其作为主键, 否则创建另一个数字列作为主键。

的问候,