假设我需要一个包含帐号ID的简单表,而不需要其他信息。有两种方法可以做到:
id varchar(255) PRIMARY KEY
或者添加数字主键:
id int PRIMARY KEY
accountId varchar(255) UNIQUE NOT NULL
这两种方法有哪些优点/缺点,您可以选择哪种方法?为什么?
第一个解决方案对可维护性有什么影响(如果我们需要更改单行的id)和性能?
答案 0 :(得分:9)
这归结为数据库世界中代理键与自然键的争论。有关该主题的文字,请参阅here,here和here。我认为这两个选项都是有效的,但在这种情况下,我会选择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的情况),那么继续将其作为主键, 否则创建另一个数字列作为主键。
的问候,