SQLの正規化についてまとめています。
SQLの正規化は、データベースのリレーションの重複を解消して最適化する
一般的には「データベースの正規化」と呼びます。
リレーショナルデータベースの関係構造を最適化して、フォーリンキー以外のデータ項目が重複しないようにテーブル構造を最適化するんですね。
コマンド一発で最適化するというよりは、設計方式の一つと考えると良いでしょう。
正規化されていないテーブルは、単一のエクセルシートのようなものです。
単純なデータアクセスは速いが、データの整合性のチェックがしにくく、データ加工時にパフォーマンスが出ないケースが多いです。また、データの格納時に重複項目が多く、容量を食います。
JOINは、正規化されたテーブルを結合して、excelシートのような非正規データを取り出す
データベースの正規化を行うほど、データベースとしては直感的に使いにくくなります。複数のテーブルに分かれているより、ひとつのテーブルに全部のデータが入っていた方がわかりやすいですよね。
必要なデータが全部ある状態にするのが、SQLのjoin(結合)という機能です。
社員の名前と年収のデータを取得したい場合、テーブルはemployees(社員)テーブルと、salaries(年収)テーブルに分かれていて、名前はemployeesテーブル、年収はsalariesテーブルにあるとします。
その場合、以下のようにjoinで2テーブルを結合して、必要なデータを取得するんですね。
mysql> select employees.emp_no, first_name, last_name, salary from employees left join salaries on employees.emp_no = salaries.emp_no where to_date = '9999-01-01' limit 10; +--------+------------+-----------+--------+ | emp_no | first_name | last_name | salary | +--------+------------+-----------+--------+ | 10001 | Georgi | Facello | 88958 | | 10002 | Bezalel | Simmel | 72527 | | 10003 | Parto | Bamford | 43311 | | 10004 | Chirstian | Koblick | 74057 | | 10005 | Kyoichi | Maliniak | 94692 | | 10006 | Anneke | Preusig | 59755 | | 10007 | Tzvetan | Zielinski | 88070 | | 10009 | Sumant | Peac | 94409 | | 10010 | Duangkaew | Piveteau | 80324 | | 10012 | Patricio | Bridgland | 54423 | +--------+------------+-----------+--------+
【関連記事】
▶SQL Joinサンプル集 Joinで遅いSQLの原因を調べる方法
VIEWは擬似的に非正規テーブルを生成できる
必要になるたびにjoinで結合をおこなっても良いのですが、頻繁に使う非正規なテーブルが欲しい場合もあります。
SQLのview機能は、擬似的に非正規テーブルを作り出す機能です。
create view jointest as SELECT employees.emp_no, first_name, last_name, dept_name FROM employees left join dept_emp on employees.emp_no = dept_emp.emp_no and first_name like 'G%' left join departments on dept_emp.dept_no = departments.dept_no Query OK, 0 rows affected (0.04 sec) mysql> select * from jointest limit 10; +--------+------------+-----------+-------------+ | emp_no | first_name | last_name | dept_name | +--------+------------+-----------+-------------+ | 10001 | Georgi | Facello | Development | | 10002 | Bezalel | Simmel | NULL | | 10003 | Parto | Bamford | NULL | | 10004 | Chirstian | Koblick | NULL | | 10005 | Kyoichi | Maliniak | NULL | | 10006 | Anneke | Preusig | NULL | | 10007 | Tzvetan | Zielinski | NULL | | 10008 | Saniya | Kalloufi | NULL | | 10009 | Sumant | Peac | NULL | | 10010 | Duangkaew | Piveteau | NULL | +--------+------------+-----------+-------------+
【関連記事】
▶SQLのview作成 joinやサブクエリを使ったselectも使用可能
上記の例では、employees(社員)テーブルと、departments(部署)テーブルをjoinで結合し、名前が「G」で始まる社員のみdept_name(部署名)を取得するviewを作成しています。
一部の現場では、SQLの整形・最適化を、SQLの正規化と呼ぶケースも
あまり数は多くないかも知れませんが、一部の開発現場ではSQLを整形して、重複条件などをなくして最適化することを「SQLの正規化」と呼ぶケースがありました。
目的は、潜在的なバグを減らすために、見やすく理解しやすいSQLを記述するよう、コード規約などでルール化するんですね。
複雑なSQLの場合は、整形ツールなどを使って、人間が見やすい形に整えてから最適化を行うとよいでしょう。
【関連記事】
▶SQL formatter オンラインで使える無料整形ツール 3選
まとめ
- SQLの正規化(データベースの正規化)は、重複項目をなくしてデータベースを最適化する設計方法
- 正規化したデータベースから、joinで非正規情報を生成できる
- viewを使って、擬似的に非正規テーブルを生成することも可能