データベースについて

Excelで見るデーターベース

データベースについて

 Excelのシートがデータベースの「テーブル」というものに相当します(Excelの機能で”テーブル”があり、そちらの方がより相応ですが、今回は広い意味で示しています)。
 Excelの行が、データベースのレコード(1件分のデータ)。列が、データベースのカラム(データの項目)。
データベースは「テーブルの分割と結合」にある
 データベースでは「情報を正規化(せいきか)する」要は「役割ごとにテーブルを分ける」だけです。例として「顧客名簿兼注文履歴」の 注文日/ 顧客名/ 住所 /電話番号 /商品名 /金額 を一括りにまとめるのではなく、テーブルを分ける。
  顧客テーブル
  顧客ID /顧客名 /住所 /電話番号
 注文テーブル
注文ID /注文日 /顧客ID /商品名 /金額
このようにテーブルを分けることで、この2つのテーブルを「顧客ID」という共通のキーで結びつける(これをJOINと言います)ことで、「○○さんの注文履歴」をいつでも取り出すことができるのです。
   JOINが、ExcelでいうところのVLOOKUPやXLOOKUP関数に相当する
データベースとの対話には「SQL」という言語を使う
 Excelでは、データを集計するのにピボットテーブルを使ったり、関数をセルに打ち込みます。
データベースでは、SQL(エスキューエル)という専用の言語を使って、データの取り出しや追加、更新を行います。例として「○○さんの注文履歴が知りたい」と思ったら、データベースにこう命令します。
  SELECT * FROM 注文テーブル WHERE 顧客ID = ‘×△□×’; 
  ”意訳:注文テーブルから、顧客IDの×△□×のレコードを全部持ってきて”

DatabaseとMaster Dataの違い

 データベース:データを格納する「入れ物(システム全体)」のこと。
  データを電子的に保存・管理するための仕組みそのものを指し、ソフトウェア(PostgreSQL, MySQLなど)と、データが実際に保存されているファイル群を合わせた全体を「データベース」と呼びます。 Excelのブック(.xlsxファイル)そのものや、そのブックが保存されている共有フォルダやサーバー、と考えると分かりやすいでしょう。
  役割としてあらゆる種類のデータ(後述するマスタデータやトランザクションデータなど)をすべて格納し、安全かつ効率的に管理する場所。
 データマスタ:その入れ物に入っている「データの種類の一つ(特に重要な基本情報)」のこと。
  「マスタ」とも呼ばれます。これは、業務を行う上での基礎となる、中心的な情報のことです。システムの中で「正本」や「台帳」のような役割を果たします。
  役割:
   ・様々な業務データから参照される、基準となるデータ。
   ・一元管理され、情報の正確性や一貫性を保つためのもの。
  特徴:
   ・あまり頻繁には変更されない。(例:商品が発売されたら登録するが、商品名が毎日変わることはない)
   ・単体で意味を持つ情報が多い。(例:顧客情報、商品情報、社員情報など)
    ExcelでのVLOOKUPやXLOOKUP関数を使う時、検索の参照元にする「一覧表」シートです。
  データマスタの役割をよりはっきりさせるために、それと対になるTransaction Data。
 トランザクションデータ
   日々の業務活動によって発生する「出来事」のデータで、一般的に「実績データ」や「履歴データ」と呼ばれます。
    役割: 「いつ、誰が、何を、どうした」という活動を記録する。
    特徴:
     ・時間と共にどんどん増え続ける。(例:売上データは毎日追加されていく)
     ・一度発生したら、基本的には変更・削除されない。(例:過去の売上記録を消したりはしない)
     ・マスタデータを参照して作られる。
     Excelでは日々の売上を入力していく「売上明細」シートがトランザクションデータです。
このシートには、「商品コード」や「顧客ID」を入力しますが、商品名や顧客名は入力しません。VLOOKUPでマスタシートから引っ張ってくる、これが「マスタデータを参照する」ということです。

このように、「データベース」という大きな器の中に、「データマスタ」という基準情報と、「トランザクションデータ」という活動記録が、互いに関連付けられながら格納されているのです。
 データベース(データマスタ、←参照するトランザクションデータ)

テーブルの作り方

 テーブル作成には、大きく分けて2つの側面があります。
  それを実現するための「具体的なSQL構文」(実装)と、どういう構造にするかという「考え方・注意点」(設計思想)です。
 テーブル作成時の注意点(設計思想)
 ① 【最重要】1つのテーブルには、1種類の情報だけを入れる
  「顧客の情報」と「注文の情報」は別のテーブルに分けるべき、という考え方です。これを正規化(せいきか)と呼びます。Excelで言うと: 「顧客マスタ」シートと「注文履歴」シートをきっちり分けるのと同じ感覚です。これ データの重複を防ぎ、修正を容易にするためです。
 ② 各行をユニークに識別できる「主キー」を必ず用意する
  テーブル内の各行(レコード)は、人間でいう「個人」のようなものです。同姓同名の人がいるように、データも偶然同じ内容になることがあります。そこで、各行を絶対に重複しない値で識別するための「背番号」が必要になります。これが主キー(Primary Key)です。具体的には customer_idやproduct_idのように、「テーブル名_id」という名前の列を作り、自動で1, 2, 3…と連番が振られるように設定するのが一般的です。
 ③ 列(カラム)の「データ型」を正しく決める
  Excelのセルにも「セルの書式設定」で「数値」「文字列」「日付」などを設定しますよね。データベースでは、これをテーブル作成時に必須で、かつ厳格に決めます。
   データの整合性: 「電話番号」の列に「あいうえお」のような文字が入るのを防ぎます。
   効率性: 「年齢」を文字列で保存するより数値で保存したほうが、データサイズが小さくなり、計算も速くなります。
   代表的なデータ型:
    ・INTEGER (または INT): 整数(年齢、個数など)
    ・VARCHAR(n): n文字以内の可変長の文字列(氏名、住所など)
    ・TEXT: 長い文章
    ・DATE: 日付(年月日)
    ・TIMESTAMP: 日時(年月日と時分秒)
    ・BOOLEAN: 真偽値(True/False)
  ④ 「NULL(ヌル)を許容するか」を慎重に決める
    NULLとは、「データが存在しない」状態を表す特殊な値です。「0(ゼロ)」や「空の文字列(”)」とは全くの別物です。Excelで言うと: 「データの入力規則」で「空白を無視する」のチェックを外す設定に似ています。例えば「会員登録フォーム」で、メールアドレスは必須項目だけど、誕生日は任意入力だとします。この場合、メールアドレスの列は、NULLを許容しない(NOT NULL制約を付ける)。誕生日の列は、NULLを許容する(未入力でもOK)
と設定します。これにより、システムのデータ品質を保ちます。
  ⑤ テーブル同士を繋ぐための「外部キー」を設定する
  「注文テーブル」には「どの顧客からの注文か」を記録するために「顧客ID」の列を設けます。このとき、「顧客テーブル」に存在しない顧客IDが間違って入力を防ぐために、「注文テーブルの顧客ID列は、必ず顧客テーブルの顧客ID列に存在する値しか受け付けません」というルールを設定します。この時の「注文テーブルの顧客ID列」を外部キー(Foreign Key)と呼びます。Excelで言うとVLOOKUPで参照先のリストにない値を検索すると#N/Aエラーが出ますよね。外部キーは、そもそもエラーになるような値を入力段階でブロックする強力な仕組みだと考えてください。これは関連するデータ同士の矛盾を防ぎ、データの整合性を保証するためです。

テーブル作成のSQL構文(実装)
思想が先、構文は後。 まず「どんな情報を」「どう分けて」「どう関連付けるか」を考える。 
基本形は CREATE TABLE です

CREATE TABLE テーブル名 (
カラム名1 データ型 制約,
カラム名2 データ型 制約,

PRIMARY KEY (主キーにするカラム名),
FOREIGN KEY (外部キーにするカラム名) REFERENCES 参照先テーブル名(参照先カラム名)
)
;

顧客テーブルと注文テーブルを作ってみる
 ❶顧客テーブル (customers)

CREATE TABLE customers (
customer_id SERIAL PRIMARY KEY,              [注意点②] SERIALで連番の主キーを作成
customer_name VARCHAR(100) NOT NULL,         [注意点③,④] 100文字以内の文字列、NULLはダメ
email VARCHAR(255) NOT NULL,
address TEXT,                        住所は長い可能性があるのでTEXT型。任意なのでNOT NULLは付けない
registered_date DATE NOT NULL DEFAULT CURRENT_DATE  [注意点③,④] 登録日。デフォルトで今日の日付が入る
);

SERIAL: PostgreSQLで使われる、自動で連番を生成してくれる便利な型です。(MySQLでは INT AUTO_INCREMENT)
PRIMARY KEY: この列が主キーであることを宣言します。
NOT NULL: この列はNULLを許容しない(必須入力)という制約です。
DEFAULT CURRENT_DATE: 値が指定されなかった場合、自動的にその日の日付が入力されます。

 ❷ 注文テーブル (orders)

CREATE TABLE orders (
order_id SERIAL PRIMARY KEY,                    [注意点②] 注文テーブルの主キー
order_date TIMESTAMP NOT NULL,                  [注意点③,④] 注文日時
customer_id INTEGER NOT NULL,                  [注意点⑤] 顧客を参照するための外部キー
amount INTEGER NOT NULL,                     [注意点③,④] 金額

— ここからが外部キー制約の定義
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)  [注意点⑤
);
FOREIGN KEY (customer_id) REFERENCES customers(customer_id)
このテーブルの customer_id 列は外部キーです。
そして、それは customers テーブルの customer_id 列を参照しています。
これにより、customersテーブルに存在しないcustomer_idをordersテーブルに登録しようとすると、データベースがエラーを出し てブロックしてくれます。

Translate »