Pythonでデータの正規化・非正規化を適用する方法を完全ガイド!初心者でもわかるデータベース設計
生徒
「Pythonでデータベースを使うとき、正規化とか非正規化って言葉を見たんですが、何のことですか?」
先生
「正規化(セイキカ)と非正規化(ヒセイキカ)は、データの置き方を整理する考え方です。ノートに情報を書くときの整理方法を想像すると分かりやすいですよ。」
生徒
「パソコンを触ったことがなくても理解できますか?」
先生
「大丈夫です。身近なたとえと、やさしいPythonの例で説明していきます。」
1. データベースとPythonの基本的な関係
データベースとは、たくさんの情報を整理して保存するための箱のようなものです。住所録や家計簿を紙で管理する代わりに、コンピュータの中で管理します。Python(パイソン)は、そのデータベースを操作するための道具です。
Pythonのデータベース操作では、「どのようにデータを並べて保存するか」がとても重要です。ここで登場する考え方が、正規化と非正規化です。
2. 正規化(セイキカ)とは何か?
正規化とは、データをできるだけ重ならないように整理することです。たとえば、同じ人の名前や住所を何度も書かずに、必要なところから参照するイメージです。
紙のノートで考えると、「名前ノート」「住所ノート」を分けて管理するようなものです。これにより、修正が楽になり、間違いも減ります。
3. Pythonで正規化されたデータを扱う簡単な例
ここでは、PythonとSQLite(エスキューライト)という軽いデータベースを使った例を見てみます。難しい設定は不要です。
import sqlite3
conn = sqlite3.connect("sample.db")
cursor = conn.cursor()
cursor.execute("CREATE TABLE IF NOT EXISTS users (id INTEGER, name TEXT)")
cursor.execute("CREATE TABLE IF NOT EXISTS orders (user_id INTEGER, product TEXT)")
cursor.execute("INSERT INTO users VALUES (1, '山田')")
cursor.execute("INSERT INTO orders VALUES (1, 'りんご')")
conn.commit()
conn.close()
この例では、「利用者」と「注文」を別々の表に分けています。これが正規化された形です。
4. 正規化のメリットと注意点
正規化のメリットは、データがきれいに整理され、同じ情報を何度も書かなくてよい点です。名前が変わった場合も、一か所直すだけで済みます。
一方で、複数の表を見比べる必要があり、初心者には少し分かりにくく感じることがあります。
5. 非正規化(ヒセイキカ)とは何か?
非正規化とは、あえて情報をまとめて保存する方法です。紙のメモに「名前・住所・注文内容」を一行で全部書くようなイメージです。
読み出しが簡単で早くなるため、表示速度を重視する場面で使われます。
6. Pythonで非正規化されたデータの例
次は、すべての情報を一つの表にまとめた例です。
import sqlite3
conn = sqlite3.connect("sample2.db")
cursor = conn.cursor()
cursor.execute(
"CREATE TABLE IF NOT EXISTS data (name TEXT, product TEXT)"
)
cursor.execute("INSERT INTO data VALUES ('山田', 'りんご')")
conn.commit()
conn.close()
この形は分かりやすいですが、同じ名前が何度も出てくる可能性があります。
7. 正規化と非正規化の使い分け
正規化は「正確さ」と「管理のしやすさ」を重視します。非正規化は「速さ」と「分かりやすさ」を重視します。
Pythonのデータベース操作では、小さな学習用や個人利用なら非正規化、大きくなってきたら正規化を考えると理解しやすいです。
8. データの正規化をPythonで確認する簡単な読み取り例
最後に、データを読み取る簡単なPythonコードを見てみましょう。
import sqlite3
conn = sqlite3.connect("sample.db")
cursor = conn.cursor()
for row in cursor.execute("SELECT * FROM users"):
print(row)
conn.close()
(1, '山田')
このように、正規化されたデータもPythonで簡単に確認できます。