このデータベーステーブルは正規化する必要がありますか?
-
26-09-2019 - |
質問
私はフィットネス情報を保存するデータベースを引き継いだのですが、あるテーブルについて、それを 1 つのテーブルのままにするべきか、3 つのテーブルに分割するべきかについて議論していました。
現在、次のテーブルが 1 つあります。 トレーニング 次のフィールドがある
id、exercise_id、担当者、体重、日付、person_id
したがって、ある日に 3 つの異なるエクササイズを 2 セット行った場合、その日のテーブルには 6 つのレコードが含まれることになります。例えば:
id、exercise_id、担当者、体重、日付、person_id
1, 1, 10, 100, 1/1/2010, 10
2, 1, 10, 100, 1/1/2010, 10
3, 1, 10, 100, 1/1/2010, 10
4, 2, 10, 100, 1/1/2010, 10
5, 2, 10, 100, 1/1/2010, 10
6, 2, 10, 100, 1/1/2010, 10
そこで質問は、複数のレコードに冗長なデータ (日付、個人 ID、運動 ID) がある場合、これを 3 つのテーブルに正規化する必要があるかということです。
ワークアウトの概要:
- ID
- 日付
- person_id
トレーニングエクササイズ:
- ID
- workout_id (Workoutsummary への外部キー)
- 運動ID
ワークアウトセット:
- ID
- workout_exercise_id (WorkoutExercise への外部キー)
- 担当者
- 重さ
欠点は、以前は結合がなかった同じクエリを実行するために 3 つのテーブルを結合する必要があるため、このリファクタリング後のクエリが遅くなることだと思います。リファクタリングの利点により、将来、重複を追加することなく、ワークアウト概要レベルまたはエクササイズ レベルで新しいフィールドを追加できるようになります。
この議論について何かフィードバックはありますか?
解決
クエリが正常化した後に遅くなることを前提としないでください。テーブルが適切にインデックス化されている場合、テーブルの少数の参加は非常に安いです。
一方、非正規化されたテーブル上のクエリを容易にはるかに遅くなってしまうことができます。たとえば、あなたの元のスキーマに、単純にワークアウトが行われた明確な日付を照会するためにはるかに高価な、それは正規化されたバージョンとなるであろうよりもされてしようとします。
は間違いなく、この時点でそれを正規化します。あなたは後にパフォーマンスの問題に遭遇した場合は、あなたが選択的にデータの特定の部分を非正規化を開始することができます。のほかにの既に正規化されたスキーマへ。しかし、すべての可能性にあなたは小規模なデータベースとそのポイントに到達することはありません。
他のヒント
新しいリファクタリングが良いようだ、とあなたは様々なテーブルに適切なインデックスを持っている場合、パフォーマンスが影響を受けることすべてではありません。 の(インデックスは、すべての外部キーの上に作成することができます)の
だから、はい、完全に正常リファクタリングのように思える。