6

比較的正規化されていない形式からデータベースを取得して正規化する場合、リソース使用率にどのような変化が予想されるでしょうか。

たとえば、正規化とは、多くの場合、少数のテーブルからより多くのテーブルが作成されることを意味します。つまり、データベースには現在、より多くのテーブルがありますが、それらの多くは非常に小さいため、頻繁に使用されるテーブルをメモリにうまく適合させることができます。

テーブルの数が多いということは、抽象化されたデータを取得するために(潜在的に)より多くの結合が必要であることも意味します。したがって、システムが実行する必要のある結合の数が多いと、何らかの影響が予想されます。

では、正規化されていないデータベースを正規化すると、リソースの使用にどのような影響がありますか(つまり、何が変わるのでしょうか)。


編集:少しコンテキストを追加するために、300を超える恐ろしいテーブルを持つ既存の(つまりレガシー)データベースがあります。データの約1/2はTEXTで、残りの半分はcharフィールドまたは整数です。いかなる種類の制約もありません。私が尋ねる理由は、主に、物事を変更する必要があり、パフォーマンスや保守性が低下しないことを他の人に納得させるためのより多くの情報を入手することです。残念ながら、私が納得させなければならないのは、正規化をできるだけ避けたいという非正規化データベースのパフォーマンス上の利点について十分に知っていることです。

4

8 に答える 8

13

問題のデータベースの詳細とそれを使用するアプリによって影響が大きく異なるため、これは実際には一般的な方法で答えることはできません。

したがって、基本的に、影響に関する一般的な期待を述べました。

  1. 冗長データが削除されるため、ストレージに対する全体的なメモリ需要は減少するはずです。
  2. クエリより高価になる可能性があるため、 CPUのニーズ高まる可能性があります(多くの場合、正規化されたデータベースでのクエリは、クエリエンジンの最適化オプションが多いため、より複雑であっても実際には高速になります)
  3. 開発者はより複雑なクエリを作成する必要があるため、開発リソースのニーズが高まる可能性があります(ただし、一方で、データの整合性を維持するために必要な開発作業は少なくて済みます)

したがって、唯一の本当の答えは通常です:それは依存します;)

注:これは、慎重で意図的な非正規化について話していることを前提としています。経験の浅い開発者に共通する「データが来るときにいくつかのテーブルを一緒に投げる」アプローチの方法を参照している場合、正規化によってすべてのレベルでリソースの必要性が減るというステートメントを危険にさらします;)


編集:cdeszaqによって追加された特定のコンテキストに関して、私は「幸運を祈ります」と言います;)

明らかに、300を超えるテーブルがあり、制約がない(!)ので、あなたの質問に対する答えは間違いなく「正規化するとすべてのレベルでリソースの必要性が減ります」(そしておそらく非常に大幅に)ですが、:

このような混乱をリファクタリングすることは、主要な作業になります。このデータベースを使用しているアプリが1つしかない場合、それはすでに恐ろしいものです。多数ある場合、それは悪夢になる可能性があります。

したがって、正規化によって長期的にはリソースの必要性が大幅に削減されたとしても、状況によっては、問題を起こす価値がない場合があります。ここでの主な質問は、長期的な範囲に関するものです。このデータベースの重要性、使用期間、将来使用するアプリの数、現在のメンテナンス作業の継続または増加などです。

それが実行中のシステムであることを無視しないでください-たとえそれが醜くて恐ろしいとしても、あなたの説明によれば、それは(まだ)壊れていません;-)

于 2009-09-04T13:54:02.917 に答える
6

「正規化」は、データベースの論理設計にのみ適用されます。

データベースの論理設計とデータベースの物理設計は、完全に異なる2つのものです。データベース理論は常に物事がこのようになることを意図してきました。この区別を見逃したり無視したりする開発者(無知、不注意、怠惰、その他のいわゆる「しかし無効な「理由」)が大多数であるという事実は、彼らを正しくしません。

論理設計は正規化されているかどうかを判断できますが、論理設計には本質的に「パフォーマンス特性」はまったくありません。'c:= c+1;'のように 本質的にパフォーマンス特性はありません。

物理的な設計は「パフォーマンス特性」を決定しますが、物理的な設計は単に「正規化されているかどうか」という品質を備えていません。

「パフォーマンスを損なう正規化」のこの欠陥のある認識は、実際には、今日存在するすべてのDBMSエンジンが物理的な設計オプションに深刻に欠けているという具体的な証拠に他なりません。

于 2009-09-04T20:31:18.557 に答える
3

以前の投稿者によるいくつかのポイントを強調するために:あなたは現在のスキーマが本当に非正規化されていますか?データベースを設計する適切な方法(imho)は、次のとおりです。

  • モデル化するシステム/情報をできる限り理解する
  • 完全に正規化されたモデルを構築する
  • 次に、必要に応じて、制御された方法で非正規化してパフォーマンスを向上させます。

(非正規化する理由は他にもあるかもしれませんが、私が手に負えないと考えることができるのは政治的なものだけです-既存のコードと一致する必要があり、開発者/管理者はそれを好きではありませんなど)

私のポイントは、完全に正規化されていない場合は、非正規化されたデータベースがなく、正規化されていないデータベースがあるということです。そして、これらのデータベースの丁寧な用語が少ない場合は、より説明的な用語を考えることができると思います。

于 2009-09-04T14:19:37.410 に答える
3

あなたの質問に対する非常に簡単な答えがあります:それは状況によって異なります。

まず、あなたの質問を「非正規化の利点は何ですか」と言い換えます。なぜなら、正規化は(純粋な論理モデルの結果として)デフォルトとして実行されるべきものであり、その後、非正規化は非常に適用できるからです。パフォーマンスが重要な特定のテーブル。非正規化の主な問題は、データの整合性管理を複雑にする可能性があることですが、場合によっては、メリットがリスクを上回ります。

非正規化に関する私のアドバイス:それが本当に痛い場合にのみ行い、挿入、更新、または削除後のデータの整合性を維持することに関して、すべてのシナリオをカバーしていることを確認してください。

于 2009-09-04T13:51:06.743 に答える
2

場合によっては、正規化によってパフォーマンスが向上することがわかりました。

小さなテーブルはより速く読みます。ひどく非正規化されたデータベースは、多くの場合、正規化された設計よりも(a)長い行と(b)多くの行を持ちます。

読み取る短い行が少ないということは、物理I/Oが少ないことを意味します。

于 2009-09-04T14:05:08.737 に答える
1

一つには、結果セットの計算をしなければならないことになります。たとえば、Blogの数がPostsの場合、次のいずれかを実行できます。

select count(*) from Post where BlogID = @BlogID

これはより高価です

select PostCount from Blog where ID = @BlogID

注意しないと、問題が発生する可能性がありSELECT N+1ます。

もちろん、2番目のオプションでは、データの整合性を維持することに対処する必要がありますが、最初のオプションが十分に苦痛である場合は、それを機能させます。

時期尚早の最適化に失敗しないように注意してください。正規化された方法でそれを行い、次に要件に対するパフォーマンスを測定します。それが不十分な場合にのみ、非正規化を検討する必要があります。

于 2009-09-04T13:47:06.717 に答える
1

正規化されたスキーマは、「更新の異常」がなく、実際に行う必要のある変更がよりローカライズされているため、INSERT / UPDATE/DELETEのパフォーマンスが向上する傾向があります。

SELECTが混在しています。非正規化は、本質的に結合を具体化することです。結合の実体化が役立つ場合があることは間違いありませんが、実体化は​​非常に悲観的であることが多いため(おそらく、そうでない場合よりも多い)、非正規化が役立つとは限りません。また、正規化されたスキーマは一般的に小さいため、必要なI/Oが少なくなる可能性があります。結合は必ずしも費用がかかるとは限らないため、自動的に費用がかかると想定しないでください。

于 2009-09-04T16:15:08.853 に答える
1

ヘンリックオペルの#3の箇条書きについて詳しく説明したいと思います。開発コストは上がるかもしれませんが、そうする必要はありません。実際、データベースの正規化により、ORM、コードジェネレーター、レポートライターなどのツールの使用が簡素化または有効化されます。これらのツールを使用すると、アプリケーションのデータアクセス層に費やす時間を大幅に短縮し、開発をビジネスの追加に進めることができます。価値。

正規化されたデータベースの開発の側面については、ここでStackOverflowに関する優れたディスカッションを見つけることができます。良い答え、コメント、考えるべきことがたくさんありました。

于 2009-09-22T14:27:45.950 に答える