0

詳細については、こちらの古い投稿を参照してください データベースの正規化 - 誰が正しいのですか?

素晴らしい回答に感謝しますが、私たちが作っているこのシステムは学習のためだけのものではないことを強調したいと思います. 本校ならではの入学制度です。約 4 か月前に開始し、非正規化に関する混乱を除けば、システムは問題なく動作しました。

私が言ったように、彼の理由は次のとおりです。

  1. 彼は、過去の経験からすべてのシステムで行ったように、第 2 正規形で十分だと言いました。

  2. 私たちと一緒に働いている人 (十分な技術的知識がない) は、十分な属性/行を持たないテーブルから必要なクエリを作成することはできません. (私の場合、他の属性から簡単に計算できるため、合計単位を削除することにしました. )

  3. 会計、給与計算、在庫、購買などの他のシステムは、登録システムと統合する予定です。その場合、クエリにアクセスせずに、新しい各システム データベースを登録システム データベースに直接接続することをお勧めします。

  4. 彼は、各学生の計算された平均成績などのすべての従属行もテーブルに含める必要があると主張しました。なぜなら、必要なのは物理データであり、ビューによって再計算されないからです。

  5. さらに重要なことは、彼がすべてのトランザクションをデータベースに入力することを望んでいたことだと思います。取引のバランスを取るための借方と貸方の場合と同様。

私の場合、彼から聞いたところによると、彼はクエリからクエリを作成すること以外は速度について何も言及していません (これが非正規化が必要な主な理由だと思います)。彼は単純に、すべてをデータベースに記録したいと考えています。

私の立場はこれらすべての反対です。速度よりも精度が重要な場合、Microsoft SQL Server を使用しているため、正規化は完璧です。

最後に、students_info テーブルに full_name 列を含めたいと思っていたことを思い出しました。彼の理由は?彼は、「別のクエリを作成するよりも、テーブルから読み取る方が良いです。プログラムが full_name のユーザー入力を制御できることを確認してください」と述べました。

このシステムの作成をやめる前に、経験者の方からお知らせください。

4

3 に答える 3

3

クエリが誤って削除される可能性があるため、さらに問題が発生します。

これがバージョン管理ソフトウェアの目的です。また、ビューを「誤って」削除できる場合は、テーブルを誤って削除する可能性があります。

彼は、過去の経験からすべてのシステムで行ったように、第 2 正規形で十分だと言いました。

それから彼は十分な経験を持っていません。特に会計では。

私は、部下が 5NF でパフォーマンスの高い設計をしてくれると主張することで有名 (または悪名高い) です。それができない場合は、おそらく a) 5NF が何であるかを知らないか、b) すべての行に ID 番号が必要だと考えています。(すべての行に ID 番号があると、必要な結合の数が増え、多くの場合、パフォーマンスが低下し、正規化とは何の関係もありません。) これらはどちらも教育の良い機会です。

BCNFで十分かもしれません。2NF は通常そうではありません。

この戦いに負けた場合は、CHECK() 制約を主張して、合計が常に正しいことを確認してください。

私たちと一緒に働いている人 (十分な技術的知識がない) は、十分な属性/行を持たないテーブルから必要なクエリを作成できません。

いくつかのビューを追加すると、短期的には役立ちます。更新可能なビューをいくつか追加する必要がある場合があります。ただし、本番グレードの登録システムで会計データを扱うことになる人に、一定レベルの技術知識を要求する権利があります。

会計、給与計算、在庫、購買などの他のシステムは、登録システムと統合する予定です。その場合、クエリにアクセスせずに、新しい各システム データベースを登録システム データベースに直接接続することをお勧めします。

ビュー (クエリ) とテーブルは、1 つの名前空間を共有します。クライアントコードは、「ビューではなくテーブルに接続したいので、'student_payments' という名前にする必要があります」とは言いません。クライアント コードは、「'student_payments' に接続する」というだけです。

とはいえ、支払表に挿入する権限を持つ人は、支払表に正しく挿入する方法をよく知っています。他の列の計算の結果である列を含める必要がある場合は、CHECK() 制約を主張してください。

すべてのクライアント アクセスがストアド プロシージャを介して行われ、クライアント コードがテーブルに直接アクセスできないように設計されたシステムあります。このアプローチは、有効なトランザクションを一度に多数のテーブルに挿入する必要がある場合に非常に有効です。

彼は、各学生の計算された平均成績などのすべての従属行もテーブルに含める必要があると主張しました。なぜなら、必要なのは物理データであり、ビューによって再計算されるものではないからです。

必要なのは、データベースが常に正しい答えを提供することです。

さらに重要なことは、彼がすべてのトランザクションをデータベースに入力することを望んでいたことだと思います。取引のバランスを取るための借方と貸方の場合と同様。

最後に、賢明な何か。金融取引は通常、挿入されるだけです。それらが正しくない場合、それらは更新または削除されません。代わりに、補償トランザクションを挿入します。(そして、その理由を願っています。)

実際問題として、最初のリリースには計算列を含めません。それらの不在が実際のパフォーマンスの問題を引き起こした場合にのみ、それらを追加します。

そうは言っても、実際のパフォーマンスの問題を特定するには、かなり高いハードルがあります。Vinny Vice-president がクエリが返されるまで 5 秒待たなければならない場合、それは実際のパフォーマンスの問題ではありません。5 秒かかるクエリが他のクエリをブロックし、全体的なパフォーマンスを毎日低下させている場合、それは実際のパフォーマンスの問題です。

1 つの SELECT ステートメントの動作に基づいてパフォーマンスの問題を判断しないでください。パフォーマンスの問題は、システム全体の動作に基づいて判断するのが理想的です。実際には、SQL ステートメントの代表的なサンプルの動作に基づいています。パフォーマンスの問題が発生する前に、代表的な SELECT、INSERT、および DELETE ステートメントを選択してください。代表的なサンプル データでテストし、少なくともタイミングを保存します。理想的には、実行計画とタイミングを保存します。

テーブルに「実際の」データを含めるためだけに計算列を含めることはしません。

計算結果を保存することによって実際のパフォーマンスの問題を解決しなければならない場合、これらのことの少なくとも1 つを実行せずに解放することはありません。

  • 制約が単一行での計算を必要とする場合、計算された値が常に正しいことを保証するために CHECK() 制約を含めます。
  • 制約で複数行にわたる計算が必要な場合は、制約を実装するためのアサーションまたはトリガーを含めます。また、dbms のドキュメントを注意深く確認し、たとえばトリガーが起動しない可能性があるインスタンスを探します。(一部のプラットフォームでは、一括読み込み中にトリガーが起動しません。)
  • CHECK() 制約、アサーション、またはトリガーを使用できない場合は、実際の合計が一致しないデータを定期的に検索するために、できればストアド プロシージャまたは同等のコードで何らかの管理プロシージャを実装します。予想合計。それを SP に実装できない場合は、cron ジョブの下で実行されるアプリケーション コードで実装します。他のプロセスに実質的な影響を与えずにこれを行う方法はたくさんあります。

多くの場合、宣言された制約も使用している場合でも、データの欠落や計算ミスをチェックする定期的な管理手順を実装します。十分な権限を持っている人なら誰でも、正当な理由、悪い理由、または理由なしで、制約を削除または無効にすることができます。(自分自身を含め、高い特権を持つユーザーは、最も危険なユーザーです。)

于 2012-05-27T11:45:52.673 に答える
0

すべてのデータを更新できるデータベースを作成している場合は、正規化が適切なアプローチです。データ項目が変更されたときに、結果がどこにでも伝播されることを確認する必要があります。難解な正規化は必要ないかもしれません (たとえば、すべての住所が米国内にあることがわかっている場合は、2 文字の州コードで問題ありません)。

「クエリが削除される」などの問題を解決するには、ビューを使用します。これらを使用すると、データのレポート ビューを基になるデータ構造に接続できます。結局のところ、データの一貫性を維持するのに最適なものは、レポートには最適ではない可能性があります。

私の経験では、最終的にはデータ マート ソリューションに向かうことになります。基になるデータは、運用アプリケーション用に正規化された形式になります。これらから派生した別のテーブルのセットがあり、レポート目的で使用されます。これらのテーブルは、非正規化され、冗長であり、グループごとに異なって見えます。Web 経由でアクセスできるものもあれば、Excel 経由でアクセスできるものもあれば、他のアプリケーション (予算予測など) にフィードするものもあります。ただし、そこに到達する前に、クエリのニーズを満たすためにビューはおそらく非常にうまく機能するはずです。

于 2012-05-27T14:35:57.320 に答える