主キーに独自の名前があるのはなぜですか?


19

数学的な観点から、テーブルには多くても1つの主キーがあると認められるため、単純なテーブルプロパティではなく、任意の名前で主キーを参照するという近視眼的な設計決定のようです。

主キーを非クラスター化からクラスター化、またはその逆に変更する結果として、まずその名前を検索し、削除してから最後に読み取ります。

表示されない任意の名前を使用することには利点がありますか、またはプライマリキーに任意の名前を使用しないDBMSがありますか?

2011年 2月22 日の編集2011年 2月22日、日付を並べ替えたくない人向け):

テーブル名から主キーの名前を導出できる関数を示しましょう(初期のsql-sever別名sybaseシステムテーブルを使用):

create function dbo.get_pk (@tablename sysname)
returns sysname
as
begin
    return (select k.name
    from sysobjects o 
        join sysobjects k   on k.parent_obj = o.id 
    where o.name = @tablename
    and o.type = 'U'
    and k.type = 'k')
end
go

gbnは、明示的な名前を指定しない場合、生成された名前を本当に好きな人はいないと述べています。

create table example_table (
    id int primary key
)

select dbo.get_pk('example_table')  

ちょうど得た

PK__example___3213E83F527E2E1D

しかし、なぜsysobjectsの名前は一意でなければなりません。テーブルとその主キーにまったく同じ名前を使用してもまったく問題ありません。

そのようにすることで、命名規則を設定する必要がなくなりました。これは誤って違反される可能性があります。

今マリアンに答えます:

  1. pkをドロップできるようにするために、pkの実際の名前を知る必要がある例として、クラスター化された主キーをクラスター化されていない主キーに変更するタスクのみを使用しました。
  2. 物には固有の名前を付ける必要はありません。簡単に一意に指定できれば十分です。それが抽象化の基礎です。オブジェクト指向プログラミングはこのようになります。異なるクラスの同様のプロパティに異なる名前を使用する必要はありません。
  3. テーブルのプロパティであるため、任意です。テーブルの名前は、それを使用するかどうかを知る必要があるすべてです。

回答:


17

主キー(および他の一意の制約)はインデックスとして実装され、まったく同じ方法で処理されます-PKとインデックスに別々のコードパスを持たせることはプログラマの観点からは意味がありません(2倍になります)バグの可能性)。

外部キーによって参照されることを除けば、PKはインデックスとして実装される一意の制約であるため、PKのプロパティを変更することは、他のインデックスのプロパティを変更することと同じです。また、明示的な名前を持つことは、他のインデックスと同様にクエリヒントで参照できることを意味します。


1
ええ、また、PKを変更できるため、どの列が使用されるかを意味しています。したがって、書籍の場合は、ISBNをPKとして使用することもできます(ISBNを明確にするためにISBNと呼びます)。別のレコード(私の頭の上の例)。そのため、PKフィールドを一意のIDに変更する必要があります。
ネイサンマッキネス

1
「PKはインデックスを使用する制約です」という言い方を好むでしょう。2つの制約(PKとFK-または2つのFK)が同じインデックスを使用できる場合があります。
ypercubeᵀᴹ

@ypercube私は「PKは現実のデータベースの99.99%でインデックスを使用する制約」を好みます。これはもちろん、インデックスなしでPK制約を持つことができることを意味しますが、パフォーマンス上の理由により、実世界ではこれを実装します。
パセリエ

6

質問を完全に理解したかどうかはわかりません。

テーブルにインデックスがあり、そのインデックスを変更する必要がある場合、その名前に従ってインデックスを変更する必要はありませんか?インデックスのobjectIDを検索し、そのように更新を行うことができると思いますが、名前は、使用しているオブジェクトを論理的に理解するのに役立ちます。

したがって、おそらく答えは、使用中の強力な命名規則(つまり、主キーのname_PK)がある場合、テーブルの主キーで作業していることを簡単に識別できることです。

FK関係の定義についても同じことが言えると思います。オブジェクト自体はすべて異なるobjectIDを持っているため、名前の使用は論理的な解釈のために行われると思います。


5

これは人間が読みやすいように実装された詳細だと思います。

制約名は、(少なくともSQL Serverの)オプションですが、私が持っているしたいPK_MyTableためMyTableではなく、PK_MyTabl___16feb6d8a


3

歴史的に、主キーと一意キーは、クリストファーJ.デイトが教えているように、すべて候補キーと呼ばれます。

候補キーは一意であり、主キーのロールを再生できるインデックスです。したがって、すべての候補キーは一意のキーです。プライマリキーは、テーブルデータにアクセスするための推奨される方法として、候補キーの1つを単に指定したものです。

これに照らして、PRIMARY KEYという名前は、テーブルプロパティとしてアタッチされた優先候補キーの任意の名前です。主キーは1つだけです。

実際には、名前付き候補キーの作成で十分です。

インデックスをクラスター化されたクラスターから非クラスター化されたクラスターに変更することは、プライマリキーを見つけることの練習に過ぎません。PRIMARY KEYの定義を持つことは、データベースの純粋主義者にとって本質的にノスタルジーの感覚であると言えると思います。データベースの純粋さの感覚は、実際の単語UNIQUE KEYの代わりに、キーワードCANDIDATE KEYによって一意のキーを呼び出す必要がありました。

候補キーの定義とそれに関するCJDateのコメントを表示するには、ここをクリックしてください


1

主キーがテーブルオブジェクトを表すと言うことはありません。テーブルオブジェクトはクラスター化インデックスであり、主キーではありません。主キーがクラスター化インデックスと同じである必要があることを示すものは何もありません。多くの場合そうですが、そうである必要はありません。主キーは、非クラスター化インデックスによって簡単に十分に実施できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.