非正規化とパフォーマンスのトレードオフ
メニューを表示するにはスワイプしてください
非正規化は、複数の関連テーブルからデータを1つのテーブルにまとめることで、意図的に冗長性を導入するプロセス。データが頻繁に一緒にアクセスされ、複数テーブルの結合によるオーバーヘッドがボトルネックとなる場合に、クエリ性能向上のために用いられる手法。正規化は冗長性の排除とデータ整合性の維持を目的とするが、非正規化は高速なデータ取得のために一部の重複を許容する。レポーティングや分析、複雑な結合がコストとなる読み取り中心のワークロード最適化などの状況で、非正規化の検討が推奨される。
1234567891011121314151617181920212223242526272829303132-- Denormalized table structure combining student and course information CREATE TABLE student_course_info ( enrollment_id INT PRIMARY KEY, student_id INT, first_name VARCHAR(50), last_name VARCHAR(50), email VARCHAR(100), course_id INT, course_name VARCHAR(100), course_code VARCHAR(20), credits INT, enrollment_date DATE, grade CHAR(2) ); -- Example of inserting combined data from normalized tables INSERT INTO student_course_info SELECT e.enrollment_id, s.student_id, s.first_name, s.last_name, s.email, c.course_id, c.course_name, c.course_code, c.credits, e.enrollment_date, e.grade FROM enrollments e JOIN students s ON e.student_id = s.student_id JOIN courses c ON e.course_id = c.course_id;
関連データを非正規化構造でまとめて保存することで、情報取得時の結合処理を減らすことが可能。特に複数テーブルのデータを必要とするクエリで、顕著なパフォーマンス向上が期待できる。一方で、非正規化にはトレードオフが存在する。主な欠点はデータの冗長性であり、学生名やコース情報など同じ内容が複数行に繰り返されるため、ストレージ消費量が増加し、更新作業も複雑化する。データの更新が適切に管理されない場合、不整合が発生するリスクも高まる。非正規化の採用は、これらのリスクとパフォーマンス向上の効果を慎重に比較検討する必要がある。
1234567891011-- Querying a student's course enrollments in a normalized schema SELECT s.first_name, s.last_name, c.course_name, e.grade FROM students s JOIN enrollments e ON s.student_id = e.student_id JOIN courses c ON e.course_id = c.course_id WHERE s.student_id = 1; -- Querying the same information from a denormalized table SELECT first_name, last_name, course_name, grade FROM student_course_info WHERE student_id = 1;
1. 非正規化の潜在的な利点は何ですか?
2. 非正規化テーブルに関連するリスクは何ですか?
3. どのような場合に正規化よりも非正規化が好まれるでしょうか?
すべて明確でしたか?
フィードバックありがとうございます!
セクション 1. 章 6
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください
セクション 1. 章 6