- - PR -
主キーについて
1
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2005-04-13 21:40
アドバイスを下さい。
以下のようなテーブルがある場合主キーは必要なのでしょうか? はじめはどのようなテーブルでも主キーを付けるべきだと考えていたため 1.のフィールドを意味もないのに態々付け、主キーに設定しました。 よろしくお願いします。 レコード数は一日2万件ほど増えていきます。 テーブルの構造 <フィールド> 1.SEQ 2.場所 3.部屋 4.席 5.購入品 6.購入金額 (SEQはシーケンスオブジェクトを使用して、一意に割り当てています。) <INDEX> A. フィールド1.に主キー B. フィールド2. 3. 4. に複合ノンユニークキー (検索をかける場合にこの項目を使用するため) DBはORACLE9です。 | ||||||||
|
投稿日時: 2005-04-13 22:02
必要。 主キーが無いとUpdate文を実行する必要が生じたときに泣きが入りません?OracleはROWIDがあるからまだ良いけど、ODBC経由でアクセスしている時など非常に困るはず。 | ||||||||
|
投稿日時: 2005-04-13 22:25
unibon です。こんにちわ。
一般に、ログ(?)のようなテーブルには、主キーは付けなくても良いです。文書番号とかが付いているのならば、それを主キーにするのが普通でしょうが、文書番号にあたるようなIDを付けることが思い付かないようなテーブルならば、付ける必要はないでしょう。付ければ逆に冗長になってしまいます。
このようなキーを人為キー(artificial key)と言います。上述のように、論理的な観点から言えば、なくても良いのですが、物理的にプログラムからアクセスする場合は、主キーがあったほうがなにかと便利です(SQL が書きやすい等)。プログラムの立場からすれば、とにかく付けておいたほうが無難です。ただ、このようなキーを付けるためには管理に手間がかかるのでそれとの引き換えになります。 | ||||||||
|
投稿日時: 2005-04-13 23:20
ツール等で、グリッド上でのデータ更新を行いたい場合とか、
主キーが必要になるケースもありますね。(あったら便利という観点) 論理的な設計という観点からは冗長で不要なものであっても、 実際にプログラミングを行ううえでは、 あった方が楽にプログラミングできるという場合もあります。 | ||||||||
|
投稿日時: 2005-04-14 07:19
人工キーを付けると実行性能を落とす可能性もあるので注意が必要。自然キーで一意性を確保できる場合には、(それが複合キーであったとしても)自然キーを主キーにするべきだと思います。 たとえば、データの抽出範囲指定は多くの場合ユーザーが画面から入力しますね。この入力値が、自然キーに該当することはありますが、人工キーに該当することはほとんどないと思います。(人工キーを画面から入力することは考えにくい。) 自然キー(主キー)に該当する場合は範囲スキャンで効果を発揮する可能性が高いですが、人工キーだとフルスキャンになってしまいます。 なので、私は人工キーには反対。 | ||||||||
|
投稿日時: 2005-04-14 09:37
unibon です。
ちょっと書き足りませんでしたが、人工キーを付けたほうが良い、ということではないです。主キーを付けないよりは、人工キーであっても主キーを付けておいたほうが、プログラムから使う分にはそのほうが無難で良い、ということを書きたかったのです。 プログラムから、行を特定する目的で、主キーがあればそれを使い、なかったらインデックスを使う、ということをやることがよくあります。でも、論理的な観点からすればそのためにキーやインデックスを使うのは本来の目的とは違うので付けないほうが良いのですが、でも、付けてないばかりにプログラムが複雑になったり、パフォーマンスが悪くなったりするのもしゃくです。RDB にアクセスする手段が SQL とその結果セットをカーソルで走査するというやりかたに縛られているためかもしれません。 | ||||||||
|
投稿日時: 2005-04-14 10:25
主キーが5〜6カラム以上あって、しかもそのテーブルが親テーブルとなっている場合、物理設計の段階では代替キーも検討すべきだと思います。でないと、その親テーブルに従属する全ての子テーブルに、リレーションを張るための外部キーを5〜6カラム以上もセットする必要が出てしまいますから。さらに、そこにインデックスを張るともなれば領域の無駄や性能劣化にもつながりますし。 [ メッセージ編集済み 編集者: あんとれ 編集日時 2005-04-14 10:32 ] | ||||||||
|
投稿日時: 2005-04-14 12:19
そういうことであれば納得です。
うーん。微妙ですね。私はそれでも 5〜6列の複合主キーを付けますよ。子テーブルにリレーションを張るために 5〜6列持たなければならないというは記憶領域ではデメリットだけど、その子テーブル単体での見通しが良くなるというメリットもあるので。自然キーというのは、その値そのものに意味を持っているわけだから、親テーブルと結合しなくても子テーブルだけで意味が取れるようになる。 | ||||||||
1
