21

私はこれらのテーブルを持っています:

Projects(projectID, CreatedByID)
Employees(empID,depID)
Departments(depID,OfficeID)
Offices(officeID)

CreatedByID外部キーですEmployees。ほぼすべてのページの読み込みに対して実行されるクエリがあります。

3つの結合を削除するために、冗長なOfficeID列を追加するのは悪い習慣ですか?Projectsまたは、次のことを行う必要があります。

SELECT * 
FROM Projects P
JOIN Employees E   ON P.CreatedBY = E.EmpID
JOIN Departments D ON E.DepID = D.DepID
JOIN Offices O     ON D.officeID = O.officeID
WHERE O.officeID = @SomeOfficeID

アプリケーションプログラミングでは、「最初にベストプラクティスで記述し、後で最適化する」のですが、データベース管理者は常に結合のコストについて警告しています。

4

13 に答える 13

10

データベースの整合性の問題 (データの重複や欠落の可能性など) を取り除くために、必要な限り常に正規化してください。

非正規化によってパフォーマンスが向上したとしても (通常はそうではありません)、データの整合性を失うことの代償は正当化するには高すぎます。

レガシー データベースのあいまいな問題をすべて修正する作業をしなければならなかった人に、良いデータを好むのか、(もしあれば) わずかな速度の向上を好むのかを尋ねてみてください。

また、John が述べたように、(速度/レポートなどのために) 非正規化されたデータが必要になった場合は、生データを保持して別のテーブルに作成します。

于 2009-01-30T18:15:12.447 に答える
7

結合のコスト自体はそれほど心配する必要はありません(数百万のユーザーに拡張しようとしている場合を除きます。その場合は絶対に心配する必要があります)。

これを呼び出しているコードへの影響についてもっと心配したいと思います。正規化されたデータベースは、プログラミングがはるかに簡単であり、ほとんどの場合、アプリケーション自体の効率が向上します。

とはいえ、理由の範囲を超えて正規化しないでください。正規化のための正規化を見てきました。これは通常、実際のデータの1つまたは2つのテーブルと、外部キーだけで満たされた20のテーブルを持つデータベースになります。それは明らかにやり過ぎです。私が通常使用するルールは次のとおりです。列のデータが複製される場合は、正規化する必要があります。

于 2009-01-30T18:04:46.837 に答える
5

そのスキーマを第 3 正規形のままにし、DBA に結合コストについて文句を言わせたほうがよいでしょう。

于 2009-01-30T19:54:02.357 に答える
4

他のすべてを試す前に、非正規化を検討するべきではありません。

これのパフォーマンスは本当に問題ですか?データベースには、整合性を損なうことなく高速化するために使用できる機能はありますか? キャッシュによってパフォーマンスを向上させることはできますか?

于 2009-01-30T21:58:08.533 に答える
4

非常に病的な状況にない限り、結合のコストについて警告している DBA について最も心配しています。

于 2009-01-30T20:04:29.403 に答える
3

正規化は品質決定です。

非正規化はパフォーマンスの決定です。

それが理由です -

痛くなるまで正常化します。機能するまで非正規化します。


品質の決定は、許容できる最小の正規形を示します。

  1. テーブルにとって重要な非冗長性はどれくらいですか?
  2. どの程度の速度でデータを管理したいですか?
  3. テーブル間の関係をどの程度明確にしたいですか?

パフォーマンスの決定は、受け入れ可能な最大の正規形を示します。

  1. データベースの応答は十分に速いですか?
  2. 結合が多すぎると速度が低下しますか?

あなたのケースで許容できる最小と最大の正規形を修正したら、その中間の正規形を選択します。

于 2015-09-11T14:15:17.727 に答える
3

正規化して、設計の概念とその関係をモデル化します。どのような関係が変わる可能性があるか、また、そのような変化がデザインの観点からどのような意味を持つかを考えてください。

あなたが投稿したスキーマには、明らかなエラーのように見えるものがあります(組織の仕組みに関して特別なケースがある場合、これはエラーではないかもしれません)-すべての部門が正確にあるという暗黙の仮定があります1 つのオフィスであり、同じ部署に所属するすべての従業員がそのオフィスで働いていること。

部署が 2 つのオフィスを占有している場合はどうなりますか?

従業員が名目上は 1 つの部門に属しているが、別のオフィスで働いている場合はどうなるでしょうか (物理的なオフィスを指していると仮定して)。

于 2009-01-30T18:31:37.857 に答える
2

この例では、テーブルに適切に設定されたインデックスにより、結合が非常に高速に実行され、100,000 の行に適切にスケーリングされます。これは通常、問題を回避するために私がとるアプローチです。

ただし、データが 1 回書き込まれ、その残りの期間にわたって選択され、毎回多数の結合を行うのは本当に意味がない場合があります。

于 2009-01-30T18:33:28.227 に答える