ようこそ!浜村拓夫の世界へ

    ブログ内検索

    最近の記事

    ブックマーク数の多い記事

    Blog Translation

    Powered By FC2ブログ

    Powered By FC2ブログ
    ブログやるならFC2ブログ


    FC2ブログ LOGIN

    with Ajax Amazon

    スポンサーサイト

    このエントリーを含むはてなブックマーク はてなブックマーク - スポンサーサイト あとで読む
    上記の広告は1ヶ月以上更新のないブログに表示されています。
    新しい記事を書く事で広告が消せます。

    外部キーのデメリットとIDリクワイアド

    このエントリーを含むはてなブックマーク はてなブックマーク - 外部キーのデメリットとIDリクワイアド あとで読む
    RDBの設計で、先駆者のお知恵を拝借したい。

    ・主キーは、自然キーか代理キーか?
    ・外部キーは、不要か?

    調べてみたら、少し混乱してきた。
    いろんな派閥があるみたいだけど、どれも一長一短で、各立場に一理ある?

    派閥とベン図


    2006-08-22 - 極北データモデリング

    ABDでは、外部キーを、resourceだけでなくeventからも追放する。
    楽々ERDレッスンで提唱されていた「コードを外部キーにしない。identifierを外部キーにする」ということを徹底すると、外部キーというものの意味が変わってくる。
    ていうか意味が純化される。外部キーとは、「記録しておきたい事実」そのものではなく、記録したい事実を参照するためのポインタになる。



    ABDの感想 - 世界線航跡蔵

    resource の中に Relationship(外部キー)が混在していることのおかしさ

    IREが沢山発生してしまうことによる結合コストを減らすための最適化テクニックとして混在させるというのはそう変な話じゃないのだと思う。


    ※IRE = Inter Relation Entity (相互関連実体)

    実装のために設計を崩すってこと?

    俺も外部キー使いまくりだけど、その方がJOINが楽だしね?

    【DB】 サロゲートキー(代理キー)の初歩

    ここまでくると、トレードオフの問題ですね。
    サロゲートキーを使うと変更に強くなります。よって保守性があがります。
    が、論理設計上必要ないものを組み込むので設計がわかりづらくなります。サロゲートキーに頼ってモデリングが甘くなる傾向を指摘する記事もあります。設計がわかりづらい、甘いシステムは保守性が落ちます。
    要は正しくサロゲートキーを使用しましょうということ。



    代理キー(サロゲートキー)は、ただのポインターだから、
    導入したからって、設計が分かりづらくなるとは思えんのだが?

    俺は、連番をidにするのが変だと思っていて、seqにしとけや!と思ったよ。
    「id」以外で、主キーのカラム名は何がいいだろ? - 浜村拓夫の世界

    ・seq (sequence) → 連番
    ・id (identifier) → 連番以外のイミュータブル(不変)の値
    が良いと思ったんだけど。。。

    自然キーが、UPDATEで変更されない=イミュータブルなら、自然キーをインデックスとして使いやすい形に加工して、パフォーマンス(実装の改善)のために、代理キーとして使えばいいじゃん!と思った。

    連番とか乱数は、再現性に欠ける要素があるので、キーとしては使いたくないのね。
    ・変化ってのは、時間によって生じる。
    ・不変ってのは、時間軸が除去された状態で生じる。

    RDBのキーは、変化に強い=不変性があって欲しいんだよね?
    「イベント」じゃなくて「リソース」のテーブルなら、「不変」かつ「再現性」のあるキーが付与できると思うんだけど、RDBの教科書の一番最初に書いておいて欲しい事柄なんだよね。

    SQLアンチパターン
    Bill Karwin
    オライリージャパン
    2013-01-26
    ¥ 3,456


    SQLアンチパターン - 開発者を待ち受ける25の落とし穴 (拡大版) from Takuto Wada


    「SQL アンチパターン」を読んだ - tsucchi の日記 2nd season

    IDリクワイアド(とりあえずID)

    ・複合主キーを使うべきテーブルに「id」を付けるな、ってのはその通りだと思う
    ・自然キーも上手く使えってあるんだけど、これは反対
    ・テーブル名が Bugs なら主キーは id じゃなくて、bug_id にしとけ、ってあるんだけど、これは微妙

    自然キーですが、僕は基本的にサロゲートキーでやるべきだと思っています。自然キーには必要に応じて一意制約をはるのがいいかな。経験上、自然キーが本当にキーだったことは一度もありませんでした。何か追加の情報(リビジョンとか日付とか)入れれば主キーに大抵なるんですが、そんなんやるくらいなら、サロゲートキー入れたほうがよっぽど楽だと思います。



    複合主キーを避けるべき理由 - 虎塚

    サロゲートキーの必要性
    さて、ここまでは、「複合主キーを避ける」という視点から考えました。ここで、サロゲートキーの必要性を理解する、という視点で考えてみます。
    「ナチュラルキーによる複合主キーでも、行のアイデンティファイアを担保できるのではないか?」という疑問が浮かぶかもしれません。
    これに対しては、「技術上可能だとしても、論理上おかしいから、そういうことはしない」というのが答えだと考えます。
    たとえば、データベースの会員テーブルで同姓同名の人を管理する場合、IDを使って識別します。これは、個々の行が別々のデータを表すからです。たとえ、氏名カラムと登録日時カラムを複合キーとして使うことで行を一意に特定できるとしても、そうしないでしょう。
    というわけで、「実装をシンプルにし、業務変更の影響範囲を小さくするために、複合主キーを避ける」という結論に行き着きました。



    会員テーブルで、同姓同名の人がいた場合、誕生日とか住所とか、他の属性と組み合わせれば、複合主キーとして使える。
    名前だけでは、重複が許されるので、主キーにならない。
    名前という自然キーだけでは、主キーにならないことは多々ある。
    →ある自然キーが世界に1個しかないという前提は、単なる思い込みでしかなく、そもそも間違っている場合が多いと。

    外部キー - Wikipedia

    外部キー(がいぶキー、英語:foreign key、FK)は、コンピュータの関係データベースの関係モデルの文脈において、2つの関係変数(テーブル)の間の参照整合性制約をいう。

    外部キー-主キーの関連を本来は設計の観点から存在していてはならない場合に存在していることや、外部キー-主キーの関連が本来は設計の観点から存在しているべきである場合に存在していないことは、関係データベースおよびデータモデリング、データベース設計についての多くの問題の原因となっていることが多い。



    RDBMSに外部キーは必要か? - plusadd blog

    外部キーについては,MySQLのサイトにメリットとデメリットが記述されている.

    MySQL 4.1 リファレンスマニュアル :: 1.8.4.5 外部キー

    メリット
    1) 関係が適切に設計されている場合、外部キー制約によって、プログラマがデータベースで不整合を引き起こすことが少なくなる。
    2) 連鎖更新および削除を使用すると、クライアントコードを単純化することができる。
    3) 適切に設計された外部キールールは、テーブル間の関係の記述に役立つ。

    デメリット
    1) キー関係を設計する上で犯しやすい間違いによって、循環ルール、連鎖削除の不適切な組み合わせなどの深刻な問題が生じることがある。
    2) データベースレベルでの余分なチェックによって、パフォーマンスに影響が生じる。そのため、一部の主要な商用アプリケーションでは、アプリケーションレベルでこのロジックがコード化されている。
    3) DBA にとって、個々のテーブルのバックアップやリストアが非常に困難になり、場合によっては不可能になるような複雑な関係のトポロジを作成することはめったにない。



    A→B→C→D→E とか、外部キーの連鎖が多段になってる場合、面倒くさそう?

    主キーと外部キーの設定について、ベストプラクティスを紹介している本とかWebサイトがあったら教えて!!!

    13歳からの論理ノート
    小野田 博一
    PHP研究所
    2006-09-21
    ¥ 1,188
    関連記事

    コメント

    コメントの投稿


    管理者にだけ表示を許可する

    トラックバック

    トラックバックURL:
    http://hamamuratakuo.blog61.fc2.com/tb.php/1202-dbad33b1

    FC2Ad

    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。