Webサイト制作コースのお申し込みはこちら Webサイト制作コースのお申し込みはこちら

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を使って、擬似的に非正規テーブルを生成することも可能

 

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。