11

アカウントIDがあり、その他の情報がない単純なテーブルが必要だとします。それを行うには2つの方法があります。

id varchar(255) PRIMARY KEY

または、数値の主キーを追加するには:

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

両方のアプローチの長所/短所は何ですか?どちらを選択しますか、またその理由は何ですか?

最初のソリューションは、保守性(単一行のIDを変更する必要がある場合)とパフォーマンスにどのような影響を及ぼしますか?

4

3 に答える 3

13

これは、データベースの世界における代理キー自然キーの議論に要約されます。トピックに関するテキストについては、たとえばここここ、およびここを参照してください。どちらの選択肢も有効だと思いますが、この場合は をAccountID自然キーとして選択します (AccountIDがアカウントごとに一意であり、null ではなく、変更の影響を受けないことを考えると)。オーバーヘッドが少なくなるためです。この場合、代理キーに付加価値は見られません。

自然キー:

  • ユーザーにとって意味がある
  • 必要なときに変更するのが難しい
  • クエリで必要な結合が少なくなる可能性があります

代理キー:

  • ユーザーにとって何の意味もない
  • 変更の対象ではありません
  • クエリでより多くの結合が必要になる可能性があります
  • 追加のインデックスまたはより大きなインデックスが必要になる場合があります
于 2012-12-07T11:28:46.033 に答える
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 つ目は成功します。

于 2012-12-07T11:15:59.333 に答える
1

その列の内容が一意である場合 (ID の場合と思われます)、それを主キーにします。そうでない場合は、別の数値列を主キーとして作成します。

よろしく、

于 2012-12-07T11:00:20.260 に答える