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

    ブログ内検索

    最近の記事

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

    Blog Translation

    Powered By FC2ブログ

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


    FC2ブログ LOGIN

    with Ajax Amazon

    スポンサーサイト

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

    「id」以外で、主キーのカラム名は何がいいだろ?

    このエントリーを含むはてなブックマーク はてなブックマーク - 「id」以外で、主キーのカラム名は何がいいだろ? あとで読む
    RDBの主キーやカラム名の設定で、最近自分のやり方が変だと思いました。

    カラム名でseqとidではどちらがふさわしいのでしょうか? 【OKWave】
    整合性制約 - オラクル・Oracleをマスターするための基本と仕組み

    ・MySQLを使い始めた頃から、全テーブルに必ず「id」という名前のカラム(フィールド)を作っていました。
    ・「id」は、Auto Increment(連番)のINT型で、主キーに設定してました。

    Auto Increment(連番)のINT型なら、カラム名は「id」じゃなくて「seq」(sequece)にしているテーブルを見たことがあります。
    今まで深く考えないで、習慣的に「id」を使っていたけど、これから「seq」にするかな?
    でも、MySQLでは自動採番(連番)のINT型を「id」にしてるテーブルが多いような気がするので、もう面倒くさいから、「seq」の代わりに「id」という名前のままで放置しとこうと思います。

    テーブルが破壊されて、データを最初から流し込む必要があるとき、不要になったレコードがあって、レコード数が減ったりしていると、歯欠けになった分だけ、それ以降の連番の割り当てがズレちゃうんだよね。

    (例)
    あるテーブルのスナップショット
    | id | name | registration_date |
    | 1 | yamada | 2010-04-01 |
    | 2 | suzuki | 2010-05-01 |
    | 3 | satou | 2010-06-01 |

    システム運用中にid=2の会員が退会して、レコードを削除する。

    削除後のテーブルのスナップショット
    | id | name | registration_date |
    | 1 | yamada | 2010-04-01 |
    | 3 | satou | 2010-06-01 |

    この後、テーブルが壊れてしまい、入会申込書のデータから手動でテーブルを作り直す。
    登録日(registration_date)の昇順でデータを入力していくと、
    | id | name | registration_date |
    | 1 | yamada | 2010-04-01 |
    | 2 | satou | 2010-06-01 |

    idがDBによる自動採番だと、以前はid=3だった佐藤さんが、id=2になってしまう。
    つまり、DBの都合で勝手に割り当てた連番(「id」=Auto IncrementのINT型)は、マスターテーブルの主キーには不向きだと思いました。
    主キーにしなくても、連番を使いたい場合は、「id」(identifier 識別子)ではなくて、「seq」(sequence 連続)という名前の方が合ってると。

    主キーには、ナチュラルキー、またはナチュラルキーを基にしたサロゲートキーが良いと思いました。
    ナチュラルキーを組み合わせて、プログラムで処理すれば、一意のサロゲートキーを作れます。

    ・32文字を超える場合は、md5等のハッシュ関数で文字数を丸める。
    ・データが多い場合は、文字長に余裕をもたせて長くする。
    ・32文字以内の場合は、punycode等で漢字を英数字に変換する。

    ・プライマリーキー(主キー)は、NULL値がない。
    ・ユニークキーは、NULL値の場合もある。

    単一カラムで主キーになるカラム名は、「id」以外だと何が良いだろうか?
    「pk」(Primary Key)だと、「user_id」を「user_pk」と書くのかな?
    何かしっくりこないです。

    「uk」(Unique Key)
    「uni」(Unique)
    「code」

    2~3文字程度で、何か良いカラム名はないでしょうか???
    良い候補が思いつかなければ、今度から作るシステムでは連番は「seq」にしとくか。

    達人に学ぶDB設計 徹底指南書 初級者で終わりたくないあなたへ
    ミック
    翔泳社
    2012-03-16
    ¥ 2,808

    関連記事

    コメント

    コメントの投稿


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

    トラックバック

    トラックバックURL:
    http://hamamuratakuo.blog61.fc2.com/tb.php/1099-62a31e3a

    FC2Ad

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