標記の件でご意見を伺いたく投稿します。
データベースにおいて、参照整合性、外部キーなど、レコードの整合性を守るのに不可欠な要素が
いくつかありますが、これらをDDLで定義するのと、フロントエンドのアプリケーションで実装する
のと、どちらが望ましいでしょうか?
世間で普及している教本等では、DDLで定義することになっているようですが、この辺りをきちんと
作り込んだ経験がありません。理由は以下の通りです。
(1) 制約でガチガチに縛ってしまうと、テストデータの作成に難儀する。
→ Access の場合、アプリケーションの画面が影も形もない段階で、テーブルのデータシート
ビューから直接データを投入できるが、制約で縛るとこの手軽さが失われてしまう。
(トリガを書けば、データは投入できるが、何だか余分な作業が増えて損をしたような気がする)
(2) データの整合性は保証できるものの、制約に違反した場合のエラーメッセージがユーザー
フレンドリーではない。
↓
結局、アプリケーションで、エラーを事前に開始するか、またはエラーメッセージをユーザー
向けの文言に書き換える処理が必須となる。
↓
DDLで制約を定義しても、アプリケーション実装の作業負担は軽くならない。
そんな訳で、主キー、規定値以外の制約をDDLで実装した経験は殆どありません。
Accessの場合、ド素人でもデータベースを直接GUIから操作できるので、設計者の意図に反して
データの整合性が損なわれるリスクはありますが、総合的に見て、DDLで制約を定義するメリット
を私はあまり感じません。
一般的にはどうなのでしょうか?
専門家の皆様のご意見をお待ちしております。
初心者ですので、わかりやすくご指導頂けると幸いです。(笑)
No.3
- 回答日時:
>Access限定の話ではなく、一般論としてのRDBのある
>べき姿です。
一般的なRDB(Oracle,SQLServerなど)でしたら、なおさら
DDLでテーブル定義すべきです。
DDLが書けなくても、PowerBuilderなどのツールを使えば
GUIでテーブル作成ができます。
しかし、GUIでテーブルを作った場合、実際に発行される
SQLは、ツールが自動生成したものが使われます。
このようなSQLでは、パフォーマンスの面で最適な設計と
ならなくなってしまいます。
OracleやSQL-Serverで一度でもパフォーマンスチューニング
を体験すればわかるのですが、RDBで最適な結果を出す
には、単にインデックスの張り方だけではなく、RDBが
管理するデータファイルのどの領域を使うかにまで踏み
込む必要があります。
上記の内容は、RDBの管理者になって、性能問題で一度
は苦しまないと、実感できないかもしれません。
これからスキルをつけて、頑張ってください。
この回答への補足
コメントありがとうございます。
実は、大規模なデータベース、ミッションクリティカル (この言葉を安易に多発するのもどうかと思いますが) な案件の経験がなく、比較的小規模なデータベースしか経験がありません。
性能上の悩みは、DB設計より、アプリケーションの作り (→ 他人の作り損ないの尻拭い) に起因することのほうが私の経験では多かったようです。
No.4ベストアンサー
- 回答日時:
>そんな訳で、主キー、規定値以外の制約をDDLで実装した経験は殆どありません。
業務の種類によって対応はまちまちですが、
私も主キー、規定値、サイズくらいですかね。
>結局、アプリケーションで、エラーを事前に開始するか、またはエラーメッセージをユーザー
向けの文言に書き換える処理が必須となる。
これも同意です。
アプリのほうでメッセージ出して、なおかつ通常のメッセージボックスはダメという要求が多い。
結局作りこむことになるのが現状
なおかつ、現在個人情報保護法等もあり、
データフィールドを個別に暗号化処理するようにしてしまったので、
基本の制約は意味を成さなくなってしまいました、
暗号化込みのデータベースが出ればまた使うかもしれないですが・・・
なので、最近に限って言えばほとんど使っていません。
コメントありがとうございます。
やはり、どの案件でも、似たような苦労をされているのですね。
私の感覚が世間の常識と極端に乖離している訳ではないことがわかり、ほっとしました。
No.5
- 回答日時:
No.3の回答の追加です。
質問の内容を読み違えていたようなので、追加で回答
します。
データの整合性を保つには、アプリケーションで行う
という意見に賛成です。
私も外部キーは、滅多なことでは作成しません。
アプリとインデックスの設計がしっかりしていれば、
ほぼ不要ですし、むしろ外部キーの更新に時間がかかる
ため、レスポンス面で不利となることがあるからです。
この回答への補足
元投稿に若干の誤字がありましたので、この場をお借りして訂正します。
> トリガを書けば、データは投入できるが・・・
→ トリガ、またはストアド等を書けば、必要に応じてデータは投入できるが・・・
> アプリケーションで、エラーを事前に開始するか
→ アプリケーションで、エラーを事前に回避するか
本当に必要なら、外部キーや参照整合性制約を定義するのはやぶさかではないが、開発初期の段階でガチガチにするのも良し悪しだと思っています。
アプリケーションをある程度作り込んでから必要な制約を追加していくのもありなのではないかと・・・。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) プログラムの起動、利用について、使用期間を設定する方法 3 2023/08/06 21:03
- 事件・犯罪 刑法についてだれか助けてください。 2 2022/06/05 04:08
- PostgreSQL DBFluteについて質問です。 環境:PostgreSQL java8 前提:webアプリケーショ 1 2022/07/07 00:49
- ネットワーク OSI参照モデルの各層の役割がわかりません。 3 2023/04/21 21:12
- 事件・犯罪 刑法についてです 2 2022/06/04 03:11
- 医療・安全 塩野義製薬の新型コロナ治療薬「ゾコーバ」の緊急承認見送り 7 2022/07/22 00:45
- Access(アクセス) Access DAOのExecuteメソッドのオプション(RecordsetOptionEnum)に 1 2022/09/19 07:34
- 式場探し・ウェディングドレス・結婚準備 弟の結婚式の前日に入籍する場合 5 2023/05/06 18:44
- 弁護士・行政書士・司法書士・社会保険労務士 売買契約とそれに付随する公正証書の記載について 2 2023/08/23 14:30
- 会社・職場 健診等の健康管理に厳しい会社で働いています。 皆様の会社は如何でしょうか?ご意見が聞きたいです。 弊 4 2023/08/22 20:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Accessでデータシートに同じデ...
-
accessでレコード更新直後の反...
-
ビューのソートについて
-
テーブルで一番古いレコードだ...
-
Accessのテーブルデータを一気...
-
ERROR1062:Duplicate entry.......
-
重複クエリを使ったデータ削除
-
sql serverのテーブルレイアウ...
-
このISAMでは、リンクテーブル・・
-
処理の途中で停止させ、再開さ...
-
Oracleで上書きImportはできま...
-
結合テーブルでINSERTする方法...
-
削除したテーブルを元に戻すこ...
-
MS Accessを共有した際にファイ...
-
MySQL インメモリでINSERTの方...
-
同一テーブルのデータを参照し...
-
access2000 オートナンバーで...
-
SQL Server Management Studio...
-
MysqlまたはPostgreSQLで、デー...
-
Access(MDB)の複製(レプリケー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Accessでデータシートに同じデ...
-
Accessのテーブルデータを一気...
-
テーブルで一番古いレコードだ...
-
ビューのソートについて
-
Oracleで上書きImportはできま...
-
accessでレコード更新直後の反...
-
このISAMでは、リンクテーブル・・
-
マテリアライズドビューとスナ...
-
アクセス レコードセットを更...
-
同一テーブルのデータを参照し...
-
htmlコードで書かれた表にphpで...
-
結合テーブルでINSERTする方法...
-
ACCESSで容量が50MBになった...
-
ERROR1062:Duplicate entry.......
-
Accessでの稼働日数計算の方法
-
削除したテーブルを元に戻すこ...
-
重複クエリを使ったデータ削除
-
Accessのインポートについて(上...
-
処理の途中で停止させ、再開さ...
-
住所のDBテーブル、マスターの...
おすすめ情報