強力なデータベース設計

強力なデータベース設計

強力なデータベース設計

アレックスS. *

「 – 仕様、設計および試験この概念設計のではなく、プレゼンテーションやプレゼンテーションの再生の精度の検査の過程である。私は、ソフトウェアを構築する最も困難な部分があることだと思う」 – フレデリック・P・ブルックスミリリットル。

このマニュアルは、実用的なデータベース・スキーマの開発の背景にある概念を説明します。 これは、リレーショナル・データベースに最も適切であるが、同じように簡単にデータベースオブジェクトに適用することができます。

消費者の購入を追跡する – このチュートリアルでは、オンラインストアで使用することができ、簡単なデータベースを構築します。

覚えておいて、その時点からの時間に、教科書「不正行為」どのように認識し、正しいデータベースの正規化(そのようなことがあれば)。 言い換えれば、リレーショナルデータベースの理論家は、このガイドを次のためにあなたに膨張させます。

1なぜそれがとても難しいですか?

データベースは、整理し、情報を保存します。 しかし、彼らはこれを行うことができます前に、私たちは、人間として、情報の構造とそれらを提供する必要があります。 つまり、私たちは、人間として、構造自体を把握する必要があります – とどこの人々はしばしば立ち往生および/または間違った意思決定の多くがそうであるように、これは、あります。

あなたは、最後の段落の人々に私のアクセントを気づいているかもしれません。 それは、自分の考えを整理することになるとほとんどの人にとって、問題が発生します! 抽象的な情報を整理しなければならない方法についての彼の思考の組織を言うまでもありません。 あなたが想像できるように、プロセスは、(通常とフラストレーションの多く)のトラップがいっぱいです。

私たちの脳を使用して、かなりの困難さに加えて、データベースは、通常のルールや構造で、剛性の形式でデータを格納し、よりもはるかに。 それにもかかわらず、データベース内の情報は、データベースが彼に課すのと同じ規則を遵守することはできません現実の世界から来ています。

良い概念設計を困難にします。 さらに困難なので、デザインが現実に働いたことができません。

それはすべてが始まる2?

データベースの設計(だけでなく、設計のあらゆる種類)が要件で始まります。 我々は、我々が何をすべきかの情報を、構築していること、そして我々はそれに対処する方法を知っている必要があります。

* theparticle @ アレックス コム

それは上の文書ではないので、我々はそれをスキップして、あなたが構築するものを知っていると仮定しますと、あなたは、ビジネス要件は、(それ自体は驚くほど困難な活動である)情報の種類を集めるんいると(そして実際そのあなたは)この情報を行う必要があります。 いずれの場合にも、データベースのスキーマを定義するプロセスは、オブジェクトから始まります。

2.1 オブジェクト

お使いのシステムがどうなる情報を知って、あなたは、オブジェクトの識別のプロセスを開始することができます。 彼らは、と全く同じオブジェクト似ていますが、ない「オブジェクト指向プログラミング。」 これらのオブジェクトは、それ自体で存在する異なる概念のオブジェクトです。 あなたはそれに触れることができれば通常、それはオブジェクトです。 あなたが何か他のものを参照することなく、何かを記述することができれば、それはあまりにも通常のオブジェクトです。 オブジェクトは、多くの場合、時間の長い期間のために存在します。

あなたが要件から、考えることができ、すべてのオブジェクトのリストを作成します。 自分では存在できないものが含まれないように注意してください。

だから、「顧客が」の対象となる場合があり、当社のオンラインストアデータベースの設計から始まります。 「製品」もオブジェクトでもよいです。 しかし、「価格」は、それ自体が存在しない可能性があるため、それが何かの「価格」でなければなりません(これはオブジェクトである可能性が非常に高いものです)、オブジェクトではありません。

このように、オンラインストアのためのオブジェクトの暫定リストが使用できます

•買い手 – 何かを買う人。

•製品 – 顧客が購入することをお勧めします製品。

これは、そのすべてのかもしれないが、我々は前方に移動すると、我々は後に何かを追加することができます。 デザインは反復プロセスであり、あまりにも頻繁に我々は戻って、私たちは持っていると私たちがいないを確認しなければなりません。

私たちはSQLを扱っていないことをこの時点でもう一つ注意すべき、あなたや任意の実装の詳細。 私たちはデザインに満足したら休暇SQLは、後のために書いているので、実装は、簡単です。

2.2イベント

今、私たちは、オブジェクトのリストを持って、我々は、彼らがどのように相互作用するかを把握するために開始することができます。 顧客が購入を行う場合はどうなりますか?

イベント – 一定時間内の1つのまたは複数のオブジェクト間の相互作用。 イベントは、自分自身では存在することはできません(そうでない場合は、彼らが対象となっているでしょう)。 イベントは、その発生時(またはその他の関連情報)を記録しなければならない他の同様のイベントから身を区別するために、異なる時間に発生します。 もちろん、彼らはまた、自分の外見についてのその他の情報を記録することができます。

私たちの前の例を拡張し、オンラインストアは、「購入」明白なハイライトです。 そこ他人であってもよく、私たちは何かを考えるならば、我々はそれを後で追加します。

私たちは何かがオブジェクトやイベントであるかどうかわからない場合、それはタイムスタンプを必要とする場合、あなたは見ることができます。何かがいくつかの時間周期で発生した場合、それは、このイベントの可能性が非常に高いです。 これは、オブジェクトのラベルを持つことができないという意味ではありません – オブジェクトが作成の時間を持つことができます。

今、あなたはすべてのオブジェクトとイベントのリストを持っている、のプロパティに移りましょう。

2.3 プロパティ

プロパティ – これらは、細部または当社の施設やイベントの特徴です。 買い手のオブジェクトは、例えば、「名前」と「姓」を持つことができます。 彼らが発生した時間を:イベントも性質を持っています!

私たちの施設やイベントを見てみましょう、と彼らに詳細情報を追加します。

BUYER 製品 SHOPPING
NAME DESCRIPTION BUYER
LAST PRICE 製品
ADDRESS タイムスタンプ
PHONES

我々が(など例えば、製品の「色」、)詳細を追加できることは明らかであるが、のは、この状態(例を複雑にする必要はありません)で、それを残してみましょう。 購入は購入時、購入(買い手)と、彼らは(製品の束)を買っているという事実を作った人であることに注意してください。

各オブジェクトとイベントが一意の識別子を持たなければならない(これは理論家を動揺されます最初のものの一つである):さて、今、これは整理することを、ここではいくつかの「提案」です。 私たちはショッピングイベントは買い手「である」と言うたびに、私たちは、クライアント識別子の購入が一意に特定のクライアントを識別していることを意味します。

私たちのテーブルのより詳細な図(ええ、私は手紙Tとの言葉を使用)

BUYER 製品 SHOPPING
顧客ID プロダクトID 購入ID
NAME DESCRIPTION BUYER
LAST PRICE 製品
ADDRESS タイムスタンプ
PHONES

これは、このようなより多くのです。 今では購入は識別子のみBUYER、ないバイヤーを持っていることを明確になります。

2.4繰り返しのプロパティ

あなたはおそらく、混乱している(または混同すべきである)前の例では、我々は購入テーブルに「製品」のこの特性を持っているということです。いいえ、私たちはその理由のために製品の数を残すことはできません。 私たちは、個々のテーブルに配布する必要があります。

コンセプトの鍵は、我々は個々の製品に関する詳細情報が含まれていますPOKUPKA_DETALIテーブルを導入ということです。 次のようにテーブルです。 新しいテーブルSHOPPINGと一緒に:

POKUPKA_DETALI SHOPPING
POKUPKA_DETALI ID 購入ID
購入ID 顧客ID
プロダクトID タイムスタンプ

私たちは、製品を購入されているかを知る必要がある場合、我々は単に購買IDまたは購入を使用してこの表を見てPRODUKT_DETALI。 明らかに、それはないですか?

今、すべての重複のプロパティは、注目に値するありません。 例えば、それらのいくつかは、特定の領域の複数のコピーを一覧表示することで簡単にインストールすることができます。 私たちのテーブルにBUYERは、我々は(複数で)電話を持っていることに注意してください。 どのように我々は、別のテーブルを導入することなく、この問題を解決することができますか? 私はあなたのアイデアを持っていると思う – 私達はちょうどバイヤーが持つさまざまな携帯電話を、リスト:

BUYER
顧客ID

NAME

LAST

ADDRESS

DTELEFON

RTELEFON

MTELEFON

FTELEFON

私たちは、単にDTELEFON(自宅の電話)、RTELEFON(卓上電話)、(携帯電話用)MTELEFONとFTELEFON(ファックス)の「電話」を交換してください。 クライアントはそれらのいずれかを持っていない場合、私たちはそれをゼロに設定します。 それは大丈夫です。 別のテーブルよりも対処すること少し簡単にして – PRODUKT_DETALI上記の例のように、残念ながら私たちはいつも、そうすることはできません。

3はほとんどやりました!

上記は、あなたがこれまでに遭遇した人とは、各プロジェクトに会う可能性が非常に高い基本的な概念のいくつかを示しています。 このレッスンの残りの部分ではあまり一般的な問題のいくつかのソリューションをより洗練された(そして時には非常に便利な)方法を説明します。

3.1プロパティ値の歴史

珍しいいくつかが、非常に興味深い要件は、特定のプロパティの値の履歴を維持する必要があることです。 例えば、当社の製品表には、価格を持っています。 どのような製品が売り出される場合は? 売却前にしての購入はneotpusknoy価格に提出しなければならない、販売の同じ価格は販売時に行われた購入に適用されなければなりません。

この要件に対処する方法はいくつかあります。 私たちは、この製品のPOKUPKA_DETALと一緒に購入価格のコピーを保存することができます。 そして、あなたは、単に自由にPRODUKT.TSENAを変更し、現在の価格で購入する顧客を参照してください。 彼女は効率的で、まだ少しも退屈しながら、このデザインは、あなたは価格履歴を確認する必要がある場合。 価格履歴を見るためには、あなたの購入を表示する必要があります。

あなたが販売上の任意のアイテムを持っている場合はどうするか、と誰もがそれを買っていません。 どのように価格がすべてで減少していることを知っていますか? (そして、どのくらいのことで?)。

このような状況に直面したとき、良いオプションは、製品と一緒に製品の価格を維持します。 したがって、我々はそれがこのようになりますようにアプリケーションを設定する必要があります。

製品
プロダクトID

DESCRIPTION

料金

そして、我々の技術の反復プロパティを使用して、上に移動、これが判明します:

製品 TSENA_ISTORIYA
プロダクトID

DESCRIPTION

TSENA_ISTORIYA ID

プロダクトID

PRICE

START_VREMYA

反復プロパティのすべての作品に加えて、我々はまた、「START_VREMYA」を追加していることに注意してください。 それはこの価格の始まりを意味しています。 このように、現在の価格を見つけるために、あなたがしなければならないすべては、最後の段落TSENA_ISTORIYAを見ています。

(あなたが製品に発生する可能性がイベントとして価格変更を検討したい場合があります、そして最後に、あなたは多かれ少なかれ同じインターフェース・テーブルを終わります)。

3.2オブジェクトの関係

オブジェクトは他のオブジェクトとの関係を持っているときには、別の比較的一般的な状況です。 人間対象が人物オブジェクトの(S)他との家族関係を有することができるデータベースオブジェクト、人々を、考えてみましょう。

関係のこれらのタイプは、イベントに非常に似ている – 彼らは長期的であることを除いて。 イベントは、ある時点で場所を取るし、終了します。 オブジェクトの関係は、(あなたが開始日とすることができるように)また、いくつかの点で形成されており、(あなたは終了日を持つことができるように)将来のある時点で破棄することができます。

例えば、「既婚」または「親」など

また、情報を複製しないように注意する必要があります。 たとえば、ユーザーが定義したかのように「結婚」:

既婚

MARRIED ID

CHELOVEK1_ID

CHELOVEK2_ID

START_DATA

終了日

次に、あなたがそこにあるものについての情報を検索したい場合は、「ジョン」は「ジェーン」と結婚して、あなたは「ジョンは」CHELOVEK1_IDまたはCHELOVEK2_IDのですか? あなたは二国間関係を持っていますか – 結婚し2つのエントリがありますが、)厳密に言えばジェーンはジョンと結婚し、ジョンはジェーンに結婚しています。 いずれにせよ、あなたは妥協します。 一方向のみ関係した場合は、運転業務に対処するために、アプリケーションのロジックを接続する必要があります。

この問題を回避する別の実施形態は、(既婚男性IDテーブル内の単純な2つの伝達関数とは対照的に)別の表にこれらの反復特性を実現することです。 いずれにせよ、あなたは(この場合は、補助的なテーブルへのアクセス速度)妥協を得ます。

ヒント:良いアプローチは、データの重複を避けるために、クリーンなデザインで始めることです。 設計時には、あなたが持っているテーブルの数を心配しないでください。

理解するためのもう一つの重要なことは、関係オブジェクト – オブジェクトが要求されない場合があるということです。 オブジェクトは、独自に存在することができます! あなたが関係を要求する必要があるとしている場合、あなたは、このオブジェクトのプロパティとして、オブジェクト、及びそのよう考えを再考する必要があります。

4最適化

あなたは完全に満足し、設計されていないまで、最適化を開始しないでください!

リレーショナルデータベースは美しく設計されています。 あなたのデザインは、(少なくとも、あなたのために)動作するように、そして非常に素晴らしいする必要があります。 ほとんどの最適化は、速度を上げるが、デザインの美しさを犠牲にする傾向があります。 あなたが途中で最適化を開始した場合、最終的にあなたは設計が不十分な混乱となります。

いくつかの方法:、テーブル数、冗長性の導入を削減する適切なインデックスを追加する(他のいくつかありますが、基本的に彼らはすべてのこれら三つの周りを公転)。

インデックスの追加4.1

(あなたが取ると、あなたのデザインを破壊する前に)最初に試されるべきパフォーマンスの向上は、インデックスを追加しています。 彼らは、パフォーマンスに大きな後押しを提供することができます。

(インデックス – 対数時間でエントリを見つけることが容易になり、特定の順序(B-木)内の列の値が含まれている特殊なデータベースファイル)。

どれだけそれがソートされていない電話帳に名前を見つけるためにあなたを取るでしょう想像? 何度も、まさにこのような課題に直面したデータベース。 インデックスは、ディスクへのデータの閲覧、むしろ些細なアクセスを行うことにより、データのソートビューを提供(対照的に、数百万レコードを検索すると、データベースは唯一のレコードを見つけるためにいくつかを見ることができます)。

データベースが低迷ある場合は、対応するフィールドにインデックスを追加すると、最も可能性の高い優れたパフォーマンスの兆候になります。

さて、これは適切なフィールド(または列)何ですか? いつでもあなたは、フィールドの値で検索を行う場合は、インデックス内の良い「候補者」を特定しています。

ほとんどの主キーと外部キーもインデックスを作成する必要があります(とデータベースのほとんどは、デフォルトでこれを行います)。 あなたは今までの日付で検索を行ってきた場合には、あまりにもインデックス化し、それら。

インデックスは、レコードと一緒に挿入され、除去されなければならないので、あなたは記録を削除する速度を、それは真剣に、ENTER更新に影響を与えることができ、またはインデックスを削除する – あなたが必要としない、インデックスの追加は、指標の選択を減らすことはありません。 これらの妥協に気をつけろ。

このことを念頭に、あなたが夢中になると、彼らはそこにあなたを必要とする理由を十分に理解せずに、すべてにインデックスを追加する必要はありません。 インデックスは検索性能を向上させる一方で、彼らはまた、スペースの無駄です。 インデックスは容易に10%からデータベースによって使用される総容量の50%を占めることができます。

別の質問に私たちをもたらしますどの:最初の単純な整数値(日付など)にインデックスを追加します。 文字列のインデックスを避ける – 彼らは本当にあなたを必要とする場合を除き。 あなたは、インデックス彼らに起動したときと、あなたはインデックス行全体、そして唯一のいくつかの小さなサイズのラインプレフィックスないことを確認してください。 物事を設定する方法については、データベースのドキュメントを参照してください。

テーブルの数の4.2削減

(インデックスが解決しない場合)のパフォーマンスを改善するための別のアプローチは、テーブルの数を減らすことです – あるいは、別の言い方をする:データベースの再構築は、(:リファクタリングこの手順を呼び出すことができますいくつかの)少数のテーブルを使用します。

このステップは非常に危険であり、(あなたの最初のデザインはひどいではなかった場合を除く)、パフォーマンスを大幅に向上させるために非常に少ないチャンスを持っています。 誤解しないで、事の再編成は非常に便利です(あなたがデザインの最初の繰り返しで何かを逃した – あなたは二回目のためにそれを改善することができます)。 しかし、少数のテーブルを使用しての明確な目的の再編成は非常に危険である、とデザイン純度(そして最終的にインデックスを)減らすのではなく、それを増加させる可能性が高いです。

また、この段階での減少は(あなたは自分の顧客のパフォーマンスデータへの負担をシフト)データベースを使用するアプリケーションコード内の追加ロジックが必要な場合があることを覚えておいてください。

これは、(我々はそれが十分な警告を鳴らし願っています)と言い、ここでの削減を考慮に関するいくつかのものがあります:

オブジェクト – オブジェクトの関係前述したように(しばしば「接続」テーブルと呼ばれる)別個のテーブルを介して実現されます。 関係が多対多である場合、これはそれを行うための正しい方法です。 関係は1対多である場合は、テーブルを削除することができ、および1つだけのテーブルに識別フィールドを取得します。

関係は1対1であれば、さらに行く、あなたは完全に一つの他のオブジェクトを吸収することができます。これは通常、一般化(または専門)の関係の場合に起こります。

例えば、動物および哺乳動物(すなわち、動物の専門である)を有し、テーブル動物、哺乳動物におけるすべてのフィールドを統合することができるデータベース。

犬とテーブルCATは、テーブルのペットにまとめることができ、アプリケーションがどのようなことを知ることができるようになります犬や猫とTYPEフィールドのすべてのフィールドを、持っているであろう2つのテーブルが似ている場合も、あなたは十分に単一のテーブルにそれらを組み合わせることができます我々は、扱っています。

可能性は無限大です – ちょうどそれをやりすぎて、まだ良いデザインを維持していない、覚えておいてください。

4.3データの冗長性

良いデザインで、冗長性の存在が大きなノーノーではありません。あなたは、2箇所以上で発生し、最低1つのバイトを、解消することを目指すべきです。このため、正当な理由もあります:冗長データが矛盾につながります!(大きな問題)は関係なく、あなたはそれのために準備したり、それを避けようとしてどのように、遅かれ早かれ、あなたがキャッチされます。

これは非常に大きな勝利を提供し、時には少し壊れているルールを言われています。(それはまた、「あなたはあなたが必要だと思う以上となっている数テーブル」の設計のための実用的にあなたの良いかつ柔軟に行うことができます)

冗長性は、主に高速なデータ・キャッシュとして使用されています。いくつかの関数を再計算またはクエリ(サブクエリ)を再実行するのではなく、あなただけの、すでに達成された値をつかみます。次のポイントは非常に重要です。彼は彼自身の場所を取得します:あなたは、冗長データを更新する必要はありません!

バックアップデータは厳密に読み取り専用にする必要があります。更新は、初期データだけで発生する必要があります。冗長データを更新する必要がありますソースを編集します。

冗長データの各部分が文書化されるべきです。あなたは真のデータの主要なソースと、それはそれのコピーのみであるという事実が何であるかを文書化する必要があります。コピーを更新しないでください。

あなたは本当の意味を変更する場合は、単に新しい値(ストアドプロシージャの良い場所)で冗長フィールドを更新します。あなたはまた(日または週の終わりに)バッチ更新を介してこれを行うことができます。実際には、バッチ処理を実行するために持っている唯一の善意である – 冗長データがデータソースに応じて、それがあるべきまさにであることを保証するために。

私は繰り返してみましょう(この点を強調):冗長データは読み取り専用する必要があります!バックアップデータは、文書化されなければなりません!更新のための手順は、文書化する必要があります!復旧手順も文書化する必要があります!

今、すべての推奨事項の後、あなたはまだ矛盾のために準備する必要があります。これは何(マーフィーによる)に関係なく起こりません。誰かが値を更新し、まだ画面上の古い値を見ています。冗長データが重要ではなく、一定期間には不適切であり得ることを確認してください。

その結果、合計、平均値、または任意のデータベース値(またはアプリケーション)は、すでにデータベース内のデータから計算される:冗長性のための良好な候補です。

一例として、のは、コモディティの私たちのジレンマの価格を見てみましょう。時間のほとんどは、我々は、価格だけを見てみたいが、また、我々はまだ価格の変更履歴を保存しておきたいです。以前、我々は、そのうちの一つは、面積価格の歴史を維持するという、二つのテーブルにこのアイデアを投げました。それは、現在の価格を得るために、追加のサブクエリ(と、より複雑なアプリケーションロジックを)取ることを除いて、すべての良いことです。

私たちは、おそらく週に一度、価格履歴が必要ですが、現在の価格は、我々は、おそらく数分ごとに必要になります。私たちは何をしますか?うーん…私たちは定義します。

製品 TSENA_ISTORIYA

プロダクトID

TSENA_ISTORIYA ID

DESCRIPTION

プロダクトID

PRICE

PRICE
START_VREMYA

前記フィールドは、この製品TSENA_ISTORIYA ID用のテーブルの最後のエントリの発見に由来する冗長PRODUKT.TSENA最後の価格です。今、平均的な使用と、私たちも、そこにはまだテーブルTSENA_ISTORIYAを信じる必要はありません。私たちは、製品とその価格を扱っています。

私たちはテーブルTSENA_ISTORIYAで価格を追加する必要があることを、我々は価格を変更する必要がある場合しかし、我々は知っている必要があります(これは明確に文書化する必要があります)。その瞬間、バッチ処理、またはストアドプロシージャ(または単に我々のアプリケーション・ロジック)は、製品テーブルの価格を再計算します。

4.3.1非正規化または接続テーブル

有用な冗長性を取得する別の方法は、既に接続の形式でテーブルを格納することによって可能です。たとえば、2つのテーブル、「受注」とがあるとし、「トランザクションを。」あなたは「契約」で見るたびに、あなたはほとんど常に「受注」にそれらを添付する必要があるとします。また、この2つのテーブルが(記録の十億)巨大であることを前提としています。それが見えるかもしれませほど悪く、そのようなデータを格納するための最良の方法は、接続前のテーブルになります(フォームではありません)テーブルを使用し、「注文」と「取引」との自然な接続です。したがって、あなたはわずかなろ過で注文を取得することができ、および(発注情報を伴って)取引するために取得することができます。

この手順は、悪用されるべきではありません!

5つのフォーマルメソッド

今、あなたは非公式のレッスンを読んだこと、のは「右」は、優れたデータベースを実行する方法を見てみましょう。

ただ、すぐに明らかに思えないかもしれないいくつかの用語:「リレーショナルデータベース」の「関係」は、単一の行の属性の間の関係を意味します。例えば、「人」の欄に「名前」の表は、「姓」の欄などを指し、各種テーブル(よくある誤解)には適用できない関係。

5.1キーのスーパーキー、主キー

比率Rのスーパーキーは、属性S≤Rどの2つの異なるタプルT1及びT2がT1 [S]ないであろうように、T2 = [S]の集合を表します。実際にはスーパーキーは、すなわち、他のタプルの大行列を作るものです:スーパーキーは、すべての列かもしれません。

キー – 任意の属性の除去は、彼がスーパーキーでなくなるという事実につながるという意味で、最小限のスーパーキーです。

キーが含ま属性のいずれかのセットは、スーパーキーもあります。

比率は、複数のキーかもしれません。そして、彼らは可能なキーと呼ばれます。

候補キーの一つは、主キーであるように選択されます。それぞれの関係は、主キーを持っている必要があります。

5.2関数従属

関数依存性は、属性のすべてのタプルの値に制限されます。S→T場合、我々は、TがSに機能的に依存していると言うこれはT1を有して設けられ、任意の2つのタプルt1とt2の間ことを意味する[S] = T2 [S]、我々はまた、= T1 [T]を有していなければなりませんT2 [T]。

例としては、都市と郵便番号が含まれています。2つのエントリが同じ郵便番号をお持ちの場合は、安全に、彼らは1と同じ都市であると仮定することができます。この場合、市は郵便番号に機能的に依存しています。

6ノーマライゼーション

多くの場合、「正規形」の概念があります1が正式にデザインし、データベース設計品質を評価するために使用されるが。

5つのがある2正規形で。非常に便利- -彼らは番号が付けられている1から5まで。どちらか一方にちなんで名付けられ、他の多くの中間的な形態は、(通常はそれはそれに付属)もあります。

通常のフォームの上に番号が付け下のフォームのすべての最高の資質を持っています。例えば、第2正規形でも、第3正規フォーマルデータベース、及び第1正規形。それに細かすぎるフォーカスをかけることなく、我々は我々のデータベースは、最高品質の通常の形態であることを確実にしたいです。上位は、通常、より良いです。事実上、これは必ずしもそうではありません。実際には、多くのデータベースは、彼らがあまりにも正規化されているという理由だけで、ビジネスやパフォーマンスの問題には適していません。いずれにせよ、それは理論です。

原則として、あなただけの最初の3つの正規形と懸念している – と、この文書では、我々はまた、のようなものである正常型ボイス・コッド、対処する必要があります「正規形3.5。」

6.1第1正規形

これは、通常の最も基本的な形で、そして唯一の要件は、データがテーブルに格納されていることです。あなたのデータは、テーブルに格納されている場合は、第1正規形に達しています。

より正式に、彼らはあなたが属性としてのみ原子値を持つことができることを、言います。例えば、テーブルは、リストのように、文字列、数値、日付などを保存することができますが、セットを格納することはできません。

データベースは、カンマ区切り値を含む列を有する場合、それは通常3、データベースは、正規化されていないことを示します。

私たちは、上記のセクションで2.3「繰り返しプロパティを」これを議論しました。

_____________________

1単に決して入れません

2以上

3物事は生活の中で具体化されている場合、常に例外があります。

6.2第2正規形

さて、ここにあります:

「第二正規形で格納されたデータベースは、それは最初に通常の形態である場合、それぞれの属性が完全に主キーに機能的に依存しています。」

– レコードを一意に識別するフィールド主キー:さて、これを説明します。属性は、レコードの残りの部分です。

さて、主キーを受け取っている機能に依存薬の助けを借りて、我々は、任意の属性の値を取得することができます。たとえば、あなたの学生のタスクのIDを持つ、私たちはあなたの名前を見つけることができます:あなたの名前は学生証に機能的に依存しています。

関数として完全には主に、複合主キーに関する。これは基本的に属性は主キー全体(その部分のない1)に関数従属でなければならないことを意味します。例えば、いくつかのアプリケーションは、複合主キーとして名前と生年月日を使用しています。名前、姓と生年月日 – このレコードの各属性は、すべてに依存しなければなりません。データベースはまた、コラム「年齢」であったと仮定します。(:キーの一部すなわち)この列は生年月日によって異なります。

6.2.1デザイン

単にデータに依存しない独自の抽象主キーを選択することで、第2正規形に到達するのは非常に簡単、それは次のようになります。あなたのテーブルにオートインクリメントの主キーを追加します。、このことができます(と頻繁に行う)虐待を注意してください。上記を行うことができない場合は、2NFを達成するための通常の方法は – 関連する機能的な関係を持つ小さなキーを持つ多くの小さな関係に元のリンクを破ることです。

6.3第3正規形

「それは第2正規形であると何の過渡的属性の依存関係が含まれていない場合、データベースは、第3正規形である。」このフォームは、我々は過渡的機能依存を避けたいという事実を除いて、2NFに似ています。例えば、X→Y(すなわち2NF)、我々はまだ接続が3NFにならないことを引き起こす可能性X→Z→Z及びYような状況、可能性が存在することがないかもしれないが。

例えば、データベースはアドレスを格納する方法を検討します。ZIPコードはほとんど常に状態と市が関与する(そして都市は状態を想定しています)。これは、この障害はない(とはならない)untangledも対応しています。

ボイス・コッドの6.4正規形

「主キー、Kは、すべての非キー属性を伴う場合にRの比は、通常フォームボイス・コッドである – 。、B、C …- Kはスーパーキーである」と

ここでは同じことを言って別の方法があります:

自明でない関数従属性X→AがRに保持している時はいつでも私たちは各レコード(自動インクリメントなどに対する新しい一意の識別子を選択した場合、その後、XはR.のスーパーキー»が、基本的にであれば、「Rの比率はBCNFであります)とフィールドを選択「は、それぞれ、」我々は、ボイス・コッド正規形を取得します。

ボイス・コッドの正規形は非常に番号を付け、通常のフォームの考え方に適合しない:それは(と仮定すると、テーブル内のデータ)を正常な形で始まります。実際には、もともとは簡略化3NFとして処方し、そしてそれは、それがわずかに困難であると証明されていることが判明した4ボイス・コッド、それも第3正規形です。したがって、我々は、3.5標準形としてボイス・コッドを考慮することができます。

7結論

データの重複を避けるために、上記のすべての正規形のためのキー(あわや)。明示的にそれを格納することなく、フィールドの値を取得する方法がある場合は、それを格納しないでください。それはとても簡単です。

__________________________

No Comments

    Leave a reply