2017-10-17 6 views
4

まず、これはかなり主観的な質問ですが、クライアントを教育するための正式な文書が必要です。SQLベストプラクティス(アイデンティティ値ハードコーディング)

背景 - 何百ものテーブルとSPを持つ大規模エンタープライズアプリケーションで、すべて正規化されたテーブルとIDカラムを使用する外部キーできれいに設計されています。

私たちのクライアントには、当社の生産Dbの複製されたコピーを使用してCrystal Enterpriseに複雑なレポートを作成する従業員がいます。

私は、社内のオフィスの場所や部門、ユーザーの標準的なロールセット、他のオブジェクトのステータス(オープン/クローズなど)など、「システム」ベースの情報として分類するものを格納するテーブルを持っています。 )、基本的には頻繁に変更されないデータです。

レポートデザイナーと財務アナリストは、内部にハードコードされたID値を持つクエリを作成しています。このようなもの

私はここでは非常に簡素化していますが、基本的には、これらのハードコードされたint値をすべての場所で使用しています。

これを見ているSQL開発者にとっては、明らかにこれを行わない組み込みの本能であるため、facepalmが表示されます。

しかし、驚くべきことに、については、ドキュメントやベストプラクティスの記事を見つけることができません。なぜなら、これは実行すべきではありません。

これらの値は決して変更されないため、これらの値が変更されない単一のシステム内では、複数の環境(ステージング/ QA/Dev)間で変化する可能性があると主張します。彼らのレポートデザインのアプローチを非ポータブルにし、1つの独立したサーバー環境でのみ機能することができます。

このアプローチを避けるべき理由について私のクライアントに教育するのに役立つ詳細な情報や記事などは、SQLの専門家にありますか?

答えて

3

あなたのレポート作成者にとって最も強力な議論は、最後の2番目の文章です。「...それらの値は、環境間で絶対に異なっている可能性があります。それは私の答えの要点になりそうです。

もちろん、質問には常にグレーの領域があります。 ID列は基本的にmagic numbersです。彼らは...

  • シーケンシャル
  • 追求し、上の参加、並べ替えや

を作成...しかし、欠点を持って高速であることのデータベースに利益を持っています実際には無作為に割り当てられています(挿入をそのテーブルに並べ替えると、別の方法で並べ替えた場合と比べて行ごとに異なるIDが得られます)。そのような特定のものを探す必要がある場合は、一般的には "ビジネス/ナチュラル/代替"キー(例:完全に作成された例)[CategoryName]も含まれています。CatgoryNameは、しばらく読める。[CategoryId]はアイデンティティですが、探したいものではありません)

通常、ドロップダウンメニューを持つWebサイトがある場合、通常は自然キーがドロップダウンの表示部分に表示され、サロゲート/アイデンティティ・キーがバックエンドで渡され、エンド・ユーザーには表示されません。

これは、データベースに対して直接クエリを書く人々がいる場合は少し難解です。彼らがデータの所有者であれば、より巨大なデータ構造について知っているかもしれませんが、そのデータ構造は「巧妙な」方法で活用できます。 を知っていれば、キーは変更されず、を知ります。これらの値は、それらを参照するだけの場合があります。しかし、もう一度、別のサーバーに照会したときにそれらが異なるとは限りません。

もちろん、ID値を使用したくない場合は、代替手段を提供する必要があります。テーブルにまだビジネス/自然/代替キーが含まれていない場合は、既存のテーブルがない場合は追加する必要があります。

また、その代替キーが整数であることには何も問題はありません(多分、企業全体の識別子が1,2,3などのオフィスにあるかもしれません)が、どこで実行しても確定的ですあなたの質問。

+0

良い答え、私はそれにすべて同意しています。実際には、あなたがすでに説明しているものを正確に持っています。一致するペアのId/Name列を使用します。それらに 'SELECT ID from Category WHERE Name =' xxx ''を変数に入れて、代わりにその変数を使用することは理解できませんので、拒否します。そうすれば、忠実な参照ができます大きな権威から私は言うことができるので、これをしないでください:参照。新しいAzure VMを起動して、異なるテーブル値を設定して、それらの報告が分かれているのに対して、私たちのアプリはそうではないでしょう。 – n4esa

+0

この件に関する権威ある記事の欠如については、 *正確にはあなたの質問ではありませんが、この投稿にも良い回答があります:https://stackoverflow.com/questions/2001375/sql-avoiding-hard-coding-or-magic-numbers – Xedni

関連する問題