開発者として、既存のコードに基づいたタスクが与えられるときはいつでも、多くの課題に直面する必要があります。そのような課題の1つ(多くの場合、最も要求の厳しいもの)には、アプリケーションのデータモデルを理解することが含まれます。
通常、わかりにくいテーブル、ビュー、列、値、ストアドプロシージャ、関数、制約、およびトリガーに直面します。これらは、意味をなすのに長い時間がかかります。そして、そうなると、保存された情報を改善して活用するための多くの方法に気づき始めます。
経験豊富な開発者であれば、最初はもっとうまくできたかもしれないこと、つまり設計上の欠陥にも気付く可能性があります。
この記事では、一般的なデータベース設計の悪い慣行のいくつか、それらが悪い理由、およびそれらを回避する方法について学習します。
データは後で消費するために保存されます。目標は常にデータを保存し、最も効率的な方法で取得することです。これを実現するには、データベース設計者は、データが何を表すのか、どのように取得するのか、どのくらいの速度で、その運用量(つまり、予想されるデータの量)を事前に知っておく必要があります。 、どのように使用されるか。
C ++のヘッダーファイル
たとえば、データが毎日手動で収集される産業情報システムは、情報がリアルタイムで生成される産業システムと同じデータモデルを持ちません。どうして?なぜなら、月に数百または数千のレコードを処理することは、 それらの何百万もの管理 同じ時期に。データ量が多い場合は、データベースの効率と使いやすさを維持するために、設計者は特別な考慮を払う必要があります。
ただし、もちろん、データの目的は正規化のレベル、データ構造、レコードサイズ、およびシステム全体の一般的な実装にも影響するため、考慮すべき側面はデータ量だけではありません。
したがって、作成するデータシステムの目的を完全に理解することは、データベースエンジンの選択、設計するエンティティ、レコードのサイズと形式、およびデータベースエンジンの管理ポリシーに関する考慮事項につながります。
これらの目標を無視すると、構造的および数学的には正しいものの、基本的に欠陥のある設計になります。
データベースの設計は決定論的な作業ではありません。 2人のデータベース設計者は、特定の問題についてすべてのルールと正規化の原則に従う場合があり、ほとんどの場合、異なるデータレイアウトを生成します。これは、ソフトウェアエンジニアリングの創造的な性質に固有のものです。ただし、すべてのインスタンスで意味のある分析手法がいくつかあり、それらに従うことが、最高のパフォーマンスを発揮するデータベースに到達するための最良の方法です。
それにもかかわらず、正規化の最も基本的なルールに従わずにオンザフライで設計されたデータベースに直面することがよくあります。明確にする必要があります。エンティティを最もよく表すレイアウトであり、レコードのクエリと挿入、更新、削除のパフォーマンスのバランスが最も取れているため、すべてのデータベースは少なくとも第3正規形に正規化する必要があります。 。
に準拠していないテーブルでつまずいた場合 3NF 、2NF、または1NFでさえ、これらのテーブルの再設計を検討してください。そうすることに投資する努力は、非常に短期的には報われるでしょう。
前のポイントに非常に関連しています。 正規化の目標 それを減らすことですが、冗長性は非常に頻繁に現れるもう1つの悪い習慣です。
設計原理の定義
冗長なフィールドとテーブルは、同じ情報の多くのバージョンを最新の状態に保つためにビジネスロジックを必要とするため、開発者にとって悪夢です。これは、正規化ルールに完全に従えば回避できるオーバーヘッドです。冗長性が必要と思われる場合もありますが、将来の開発で考慮に入れるために、非常に特殊な場合にのみ使用し、明確に文書化する必要があります。
冗長性の典型的な悪影響は、データベースサイズの不必要な増加、データの不整合が発生しやすいこと、データベースの効率の低下ですが、さらに重要なことに、データの破損につながる可能性があります。
参照整合性は、データベースエンジンがデータ品質を最高に保つために提供する最も価値のあるツールの1つです。設計段階から制約が実装されていないか、ほとんど実装されていない場合、データの整合性はビジネスロジックに完全に依存する必要があり、人的エラーの影響を受けやすくなります。
を使用している場合 データベースエンジン (DBE)、ソフトウェア開発を簡素化し、情報が常に正しく、安全で、使用可能であることを保証する、データ処理タスク用の強力なソフトウェアがあります。 DBEは、次のようなサービスを提供します。
これらの機能を知らない、または無視すると、開発は非常に不確実な道に進み、間違いなくバグや将来の問題につながります。
多くのデータベース設計者は、2つ以上のフィールドの組み合わせによって定義される複合フィールドではなく、整数IDの自動生成フィールドを主キーとして使用することについて最近話しているため、これは一種の論争の的となっています。これは現在「ベストプラクティス」として定義されており、個人的には同意する傾向があります。
ただし、これは単なる慣例であり、もちろん、DBEでは次の定義が可能です。 コンポジットプライマリ 多くの設計者が避けられないと考える鍵。したがって、冗長性と同様に、複合主キーは設計上の決定事項です。
ただし、複合主キーを持つテーブルに数百万行が含まれると予想される場合、複合キーを制御するインデックスは、CRUD操作のパフォーマンスが大幅に低下するまで大きくなる可能性があることに注意してください。その場合、インデックスが十分にコンパクトになる単純な整数IDの主キーを使用し、一意性を維持するために必要なDBE制約を確立することをお勧めします。
場合によっては、多くの列でクエリを実行する必要があるテーブルがあります。テーブルが大きくなると、これらの列のSELECTが遅くなることがわかります。テーブルが十分に大きい場合、論理的には、このテーブルへのアクセスに使用する各列にインデックスを作成して、SELECTのパフォーマンスは向上するが、INSERT、UPDATE、およびDELETEが低下することをほぼ即座に見つけることができます。もちろん、これは、インデックスをテーブルと同期させておく必要があるためです。これは、DBEにとって大きなオーバーヘッドを意味します。これは、さまざまな方法で解決できるオーバーインデックスの典型的なケースです。たとえば、テーブルのクエリに使用する主キーとは異なるすべての列に1つのインデックスしかない場合、これらの列を使用頻度の高いものから低いものの順に並べると、すべてのCRUD操作で列ごとに1つのインデックスよりもパフォーマンスが向上する可能性があります。
一方、クエリに使用される列にインデックスがないテーブルがあると、ご存知のとおり、SELECTのパフォーマンスが低下します。
また、インデックス効率は列タイプに依存する場合があります。 INT列のインデックスは可能な限り最高のパフォーマンスを示しますが、VARCHAR、DATE、またはDECIMALのインデックス(意味がある場合)はそれほど効率的ではありません。この考慮事項は、可能な限り最高の効率でアクセスする必要があるテーブルの再設計につながる可能性さえあります。
したがって、インデックス作成は常に微妙な決定です。インデックス作成が多すぎると少なすぎるだけでなく、インデックスを作成する列のデータ型が最終結果に大きな影響を与えるためです。
これは、プログラマーが既存のデータベースに直面するときに常に苦労することです。多くの場合、他の方法がないため、テーブルと列の名前でデータベースに格納されている情報を理解します。
テーブル名は、それが保持するエンティティを説明する必要があり、各列名は、それが表す情報を説明する必要があります。これは簡単ですが、テーブルを相互に関連付ける必要がある場合は複雑になり始めます。名前が乱雑になり始め、さらに悪いことに、非論理的な規範と混同する命名規則がある場合(たとえば、「列名は8文字以下でなければならない」など)。最終的な結果は、データベースが読み取れなくなることです。
パワーポイントのプレゼンテーションのヒントとコツ
したがって、 命名規則 データベースが持続し、サポートするアプリケーションとともに進化することが期待される場合は常に必要です。簡潔でシンプルで読みやすいデータベースを確立するためのガイドラインを次に示します。
インターネット上には、データベース設計のこの非常に重要な側面にさらに光を当てるデータベース命名ガイドラインがたくさんありますが、これらの基本的なガイドラインを使用すると、少なくとも読み取り可能なデータベースにアクセスできます。ここで重要なのは、命名ガイドラインのサイズや複雑さではなく、ガイドラインに従う際の一貫性です。
データベース設計は知識と経験の組み合わせです。ソフトウェア業界は、初期の頃から大きく進化してきました。幸いなことに、役立つ十分な知識があります データベース設計者 最良の結果を達成します。
優れたデータベース設計があります ガイドライン インターネット全体だけでなく 悪い習慣 そして 避けるべきこと データベース設計において。あなたのピックを取り、それに固執するだけです。
そして、忘れないでください。あなたが学ぶのは、実験、間違い、成功を通してのみです。ですから、今すぐ始めましょう。