• ベストアンサー

DBアプリケーションの設計方針 (参照整合性、外部キーなどの制約はDDLで定義すべき?)

標記の件でご意見を伺いたく投稿します。 データベースにおいて、参照整合性、外部キーなど、レコードの整合性を守るのに不可欠な要素が いくつかありますが、これらをDDLで定義するのと、フロントエンドのアプリケーションで実装する のと、どちらが望ましいでしょうか? 世間で普及している教本等では、DDLで定義することになっているようですが、この辺りをきちんと 作り込んだ経験がありません。理由は以下の通りです。 (1) 制約でガチガチに縛ってしまうと、テストデータの作成に難儀する。 → Access の場合、アプリケーションの画面が影も形もない段階で、テーブルのデータシート ビューから直接データを投入できるが、制約で縛るとこの手軽さが失われてしまう。 (トリガを書けば、データは投入できるが、何だか余分な作業が増えて損をしたような気がする) (2) データの整合性は保証できるものの、制約に違反した場合のエラーメッセージがユーザー フレンドリーではない。 ↓ 結局、アプリケーションで、エラーを事前に開始するか、またはエラーメッセージをユーザー 向けの文言に書き換える処理が必須となる。 ↓ DDLで制約を定義しても、アプリケーション実装の作業負担は軽くならない。 そんな訳で、主キー、規定値以外の制約をDDLで実装した経験は殆どありません。 Accessの場合、ド素人でもデータベースを直接GUIから操作できるので、設計者の意図に反して データの整合性が損なわれるリスクはありますが、総合的に見て、DDLで制約を定義するメリット を私はあまり感じません。 一般的にはどうなのでしょうか? 専門家の皆様のご意見をお待ちしております。 初心者ですので、わかりやすくご指導頂けると幸いです。(笑)

質問者が選んだベストアンサー

  • ベストアンサー
noname#11722
noname#11722
回答No.4

>そんな訳で、主キー、規定値以外の制約をDDLで実装した経験は殆どありません。 業務の種類によって対応はまちまちですが、 私も主キー、規定値、サイズくらいですかね。 >結局、アプリケーションで、エラーを事前に開始するか、またはエラーメッセージをユーザー 向けの文言に書き換える処理が必須となる。 これも同意です。 アプリのほうでメッセージ出して、なおかつ通常のメッセージボックスはダメという要求が多い。 結局作りこむことになるのが現状 なおかつ、現在個人情報保護法等もあり、 データフィールドを個別に暗号化処理するようにしてしまったので、 基本の制約は意味を成さなくなってしまいました、 暗号化込みのデータベースが出ればまた使うかもしれないですが・・・ なので、最近に限って言えばほとんど使っていません。

BuXiangHua
質問者

お礼

コメントありがとうございます。 やはり、どの案件でも、似たような苦労をされているのですね。 私の感覚が世間の常識と極端に乖離している訳ではないことがわかり、ほっとしました。

その他の回答 (4)

  • cse_ri2
  • ベストアンサー率25% (830/3287)
回答No.5

No.3の回答の追加です。 質問の内容を読み違えていたようなので、追加で回答 します。 データの整合性を保つには、アプリケーションで行う という意見に賛成です。 私も外部キーは、滅多なことでは作成しません。 アプリとインデックスの設計がしっかりしていれば、 ほぼ不要ですし、むしろ外部キーの更新に時間がかかる ため、レスポンス面で不利となることがあるからです。

BuXiangHua
質問者

お礼

コメントありがとうございます。 私の感覚が世間の常識と極端に乖離している訳ではないことがわかり、ほっとしています。

BuXiangHua
質問者

補足

元投稿に若干の誤字がありましたので、この場をお借りして訂正します。 > トリガを書けば、データは投入できるが・・・ → トリガ、またはストアド等を書けば、必要に応じてデータは投入できるが・・・ > アプリケーションで、エラーを事前に開始するか → アプリケーションで、エラーを事前に回避するか 本当に必要なら、外部キーや参照整合性制約を定義するのはやぶさかではないが、開発初期の段階でガチガチにするのも良し悪しだと思っています。 アプリケーションをある程度作り込んでから必要な制約を追加していくのもありなのではないかと・・・。

  • cse_ri2
  • ベストアンサー率25% (830/3287)
回答No.3

>Access限定の話ではなく、一般論としてのRDBのある >べき姿です。 一般的なRDB(Oracle,SQLServerなど)でしたら、なおさら DDLでテーブル定義すべきです。 DDLが書けなくても、PowerBuilderなどのツールを使えば GUIでテーブル作成ができます。 しかし、GUIでテーブルを作った場合、実際に発行される SQLは、ツールが自動生成したものが使われます。 このようなSQLでは、パフォーマンスの面で最適な設計と ならなくなってしまいます。 OracleやSQL-Serverで一度でもパフォーマンスチューニング を体験すればわかるのですが、RDBで最適な結果を出す には、単にインデックスの張り方だけではなく、RDBが 管理するデータファイルのどの領域を使うかにまで踏み 込む必要があります。 上記の内容は、RDBの管理者になって、性能問題で一度 は苦しまないと、実感できないかもしれません。 これからスキルをつけて、頑張ってください。

BuXiangHua
質問者

補足

コメントありがとうございます。 実は、大規模なデータベース、ミッションクリティカル (この言葉を安易に多発するのもどうかと思いますが) な案件の経験がなく、比較的小規模なデータベースしか経験がありません。 性能上の悩みは、DB設計より、アプリケーションの作り (→ 他人の作り損ないの尻拭い) に起因することのほうが私の経験では多かったようです。

  • skikichi
  • ベストアンサー率65% (45/69)
回答No.2

Accessでの話しでしょうか? システムの高い信頼性を要求したり、大規模なネットワーク管理、ユーザー管理をするのでしたら、そもそもAccessを使用しませんよね!? 小規模で高い信頼性を確保するのでしたら、Accessにもデータ整合性を確保する方法としてトランザクションが存在しますよね。 トランザクション管理やLockEditではダメですか?

BuXiangHua
質問者

補足

コメントありがとうございます。 Access限定の話ではなく、一般論としてのRDBのあるべき姿です。

  • cse_ri2
  • ベストアンサー率25% (830/3287)
回答No.1

プロなら、きちんとER図を書き、設計書もおこして、 テーブル作成もDDLで行います。 自分ひとりでシステムを起こすなら、そこまで必要ない かもしれませんが、他人を使うのであれば、きちんと した仕様書は必須です。

BuXiangHua
質問者

補足

コメントありがとうございます。 お訊きしたいのは設計ドキュメントのあり方ではなく、実装レベルでの方針です。

関連するQ&A

  • 参照整合性制約は、実装するのが当たり前?

    よろしくお願いします。 自分は、数年間開発経験のあるSEです。 Oracleの参照整合性制約は、実装するのが当たり前と思ってましたが、そうでもないのでしょうか? というのは、情報処理の本などを見ると 「RDBMSは参照整合性制約の実装により、更新異状を排除することが重要な機能」 などと書いてあり、なるほど、そうかと思ったものでした。 もちろん、開発に携わったシステムでも実装されてました。ここまでは良かったのですが・・・ 最近、関わっているシステムは、Oracleですが、参照整合性制約は実装されおらず、 全てアプリケーションがその辺を頑張ってます。 まあ、古いシステムなのでしょうがないかと思っていたのですが、今度のシステム更改(DB再設計含む)でも、 参照整合性制約は実装しない、というのです。 なんで実装しないのか、DB担当でないので分からないのですが、参照整合性制約を実装しないRDBなんて クリープを入れないコーヒーのようなものではないかと、私は思うのです。 この感覚は、正しいのでしょうか? 専門家の方、経験豊富な方、ご意見お待ちしております。 よろしくお願いします。

  • リレーションシップと外部キー制約について

    ■最終的にやりたいこと ・なるべくコード(SELECT文など)を見ずに、「DB」「テーブル定義者」「ER図」等からテーブル間の関係性を把握したい ■具体例 ・投稿一覧。「userテーブル」「postテーブル」 ・「postテーブル」の「user_id」カラムは、「userテーブル」の「id」カラムに対応 ※簡易な場合はある程度想像は付くのですが、ちょっと複雑な構成になると途端に苦労するので、何か良い方法はないかと思い、質問しました ■質問 ◆「リレーションシップを組む」際、「外部キー制約」はかけるのでしょうか? 例えば、上記「投稿一覧」DBを構築する際では、どうするのでしょうか? 1.普通、「外部キー制約」をかける 2.普通、「外部キー制約」をかけない 3.どちらでも良い ◆「外部キー制約」は何の為にかけるのでしょうか? ・「SELECT&JOIN」でデータ取得出来るのであれば、「外部キー制約」と「リレーションシップ構築」に関係性はないと思うのですが、そういう認識で合っているでしょうか? ・参照先データが削除されたら整合性がとれなくなる場合のみかけるものでしょうか? ◆「リレーションシップを確認」する目的で、「外部キー制約」をかけても良いのでしょうか? ・「データ削除の整合性」ではなく、「リレーションシップを確認」する目的で外部キー制約」をかけても良いのでしょうか? ◆「外部キー制約」以外に、「リレーションシップを確認」する方法はあるのでしょうか? ・コード(SELECT文など)を見ずに、テーブル間の「リレーションシップを確認」する方法としては、「外部キー制約」以外に何かあるのでしょうか? ・そもそも、「外部キー制約確認」=「リレーションシップ確認」という考えは正しいのでしょうか?

    • ベストアンサー
    • MySQL
  • 外部キー制約について

    外部キー制約をよく理解しておりません。 親表と子表に外部キー制約がある場合は、トランザクション中であっても 不整合は許されないのでしょうか? INSERTする場合は必ず親表から、 DELETEする場合は必ず子表からとなるのですか?

  • 参照整合性制約と外部キー

    FOREIGN KEYは、外部キー制約になるのでしょうか? FOREIGN KEYは、参照整合制約になるのでしょうか? 参照整合制約は、FOREIGN KEYで、その制約を成り立たせるために、外部キーがあるとおもっているのですが間違ってないでしょうか? ご教授お願いします。

  • 高度なmySqlの機能の使い方を教えてください。

    sqliteやmySqlを使い掲示板を何個か作りました。 基本コマンドからテーブルロックくらいまでで掲示板は作れたので、 MySQLの他の機能に意識しませんでしたが、下に書いた制約からレプリケーションまで機能が どのよな場面で使うのか知りたくなりました。 どのようなところで使うのか知りたいと思っています。 どなたかご存知でしたらどのような場面で使うのか簡単でいいので教えてもらえませんか? よろしくお願いします。 制約 整合性制約定義 ~ レプリケーション 質問項目) 必須なもの 頻繁に使うもの どういう場面で使うのか? プロジェクトの規模 大~小規模 何万行のデーター量か? データーベースの数テーブルの数 項目を参考にしたサイト ttp://kozy.heteml.jp/pukiwiki/index.php?FrontPage#o2834729 基本コマンド コマンドラインツール データ型 テーブル作成 select insert update/delete トランザクション テーブル 表結合(join)、単純結合、等価結合 テーブルロック 制約 整合性制約定義 テーブル 再帰結合 インデックス ストアドプロシージャ ストアドファンクション トリガ 外部キー ユーザ変数 フォルダ構造 設定ファイル ログファイル ユーザー管理 バックアップ レプリケーション

  • キーの目的

    すいませんが、教えてください。データベースに、主キーや外部キーというのがあります。これを設定する目的は、何なのでしょうか?意味は、本によくあるのですが、その目的が理解できないので、教えてください。 仮に、主キーを設定しても、検索でレスポンスが早くなることはないですね。 ユニーク制約をテーブルに付ける目的と同じで、単に整合性を保つだけの目的でしょうか? であれば、整合性を考えなければ、キーを設定する必要はないのでしょうか?

  • オブジェクトエクスポーラを使ったインサートについて

    はじめまして OS vista Ultimate Sql Server2005, Accsess2003 SqlServer2005のオブジェクトエクスポーラのタスク、データのインポートを使ってAccess2003で作ったデータをインポートしたいのですがエラーでうまくいきません。手順は、Sqlserverで構造が定義されたテーブルをオブジェクトエクスポーラのデータのエクスポートでAccessの空テーブルにエクスポートしそれをAccessで加工し、そのデータをインポートしたいのですが下記エラーとなります。 何か回避策があれば教えて頂きたいのですが。 ・FOREIGN KEY 制約でテーブル 'Teble1' が参照されているので、このテーブルは切り捨てられません。 よろしくお願いします。

  • access2007でaccess97のデータを読みたい

    初めて投稿します。皆様の知恵をかして下さい Access2007のソフトでaccess97のデータが読めなくて困っています。 97のデータを開こうとするとまず オブジェクト‘ファイル名‘が見つかりませんでした。オブジェクトが存在していること、名前やパス名が正しいことを確認してください と表示されます 次にokをクリックすると 現在のユーザーアカウントでは、このデータベースを変換または有効にする権限がありません。とでて データベースを変換または有効にするには次のいずれかの操作を行ってください *このデータベースにアクセスするときに使うユーザーアカウントを定義しているワークグループに参加します。 *データベースオブジェクトの開く/実行と排他だ開く権限をもつようにします などと でているのですが 書いてある意味が全く理解不能で悩んでいます。 まず access2007でaccess97のデータが読めるのか 読むためにはどうしたらよいか ご教授お願いします

  • アクセス初心者に注意点を教えてください。

    アクセスを2ケ月前から勉強し始めた超初心者です。 テキストと回答を見ながら、ひたすら問題を解いています。 順調に作成できていると思っていたのですが。。。 作成した15個のファイルを見直そうと思ったら、半分のファイルを開くことができません。 メッセージは下記です。 (1)ブックマークが違います。 (2)他のユーザーが同じデータに対して同時に変更を試みているのでプロセスが停止しました。 (3)データベースを開くことができません。アプリケーションで認識できないデータベースであるか  またはファイルが破損してます。 いろいろなサイトを見ながら、修復を試みようとしましたが私には理解が難しくできません。 データベースユーティリティ→最適化/修復を押しても同じエラーメッセージがでてしまい ファイルを開くことができません。 開くことができないファイルは大切なものではないので問題ないのですが 4月からはアクセスを使って簡単な入力作業などの仕事を始めます。 こんなミスは絶対に許されないので、エラーを出さない作成方法を学ぶたいです。 新しくファイルを作成して保存していく上で、注意することを教えていただけませんでしょうか。 どうぞ宜しくお願い致します。

  • Access の外部データの利用について

    よろしくお願いします。 外部データを利用する場合、「インポート」と「リンク」があります。 「インポート」したほうがよい場合 と 「リンク」したほうがよい場合があります。 この二つの方法は、相反する場合になります。 「インポート」したほうがよい場合のなかに意味の分からない項目があります。 1.複数のユーザーで使用しない。 2.利用するアプリケーションがAccessに限られる。 1.は、「外部データを利用して作成している データベースを複数のユーザーで使用しない」という意味  でしょうか。 または、「外部データを複数のユーザーで使用しない」という意味でしょうか。 2.の「利用するアプリケーション」とは、作成しているデータベースのことでしょうか。 または、「外部データ」のことでしょうか。 以上の2点が読み取れません。 どちらを意味しているのか、ご教授をお願いします。 よろしくお願いします。 Windows Vista SP-2 Office Professional 2007 SP-2