pyてょん日記

一寸先は闇が人生

データベース,DBMS とは何か?

 IT の文脈における「データベース」という言葉の意味,仕組みを解説してみた.

tl;dr

  • データベース:一定の形式で作成,管理されたデータの集合

  • 広義の「データベース」の構成

    • データ本体(紙,電子媒体など)
    • データの管理者(人,コンピュータ(ソフトウェア)など)
  • IT の文脈での「データベース」の構成

    • データベースファイル:データが書き込まれているファイル.データ本体.
    • データベース管理システム(DBMS:データベースファイルに読み書きを行うソフトウェア.

データベースに格納されたデータへのアクセス手順

f:id:pytwbf201830:20190905020927p:plain
データベースの仕組み

「データベース」とは何か?

広義の「データベース」

 「データベース」という言葉は,「一定の形式で作成,管理されたデータの集合」を意味する.コンピュータで管理されているデータに限らず,紙に書かれたデータでもコンピュータ上に保存されたデータでも,それらが「一定の形式で」作成・管理されていれば立派な「データベース」である.例えば,テンプレートがあらかじめ印刷された紙に入力項目を埋め,それらをクリアファイルで月,年ごとに管理すればそれはデータベースに成り得る(広義の「データベース」).

 「データベース」は,

  • データ本体(紙,電子媒体など)
  • データの管理者(人,コンピュータ(ソフトウェア))

の 2 つの要素から構成されるデータを管理するシステム(手作業で管理することも「システム」に含まれる)であると言える.

IT の文脈での「データベース」

説明

 IT の文脈では,「データベース」は「コンピュータ上でデータの集合を管理するシステム」を意味することが多い.このシステムは「データ本体 + そのデータを管理するソフトウェア」で構成される.

 データの実体はデータが書き込まれた「ファイル」(「データベースファイル」という)である.そして,データベースファイルに読み書きを行うソフトウェア,「データベース管理システム」(DBMS)によってそのデータを管理する.データベースのユーザは,DBMS を介してデータベースファイルに書き込まれたデータへアクセスする

まとめ

 以上をまとめると,IT の文脈における「データベース」は,

  • データベースファイル:データが書き込まれているファイル.データ本体.
  • データベース管理システム(DBMS:データベースファイルに対して読み書きを行うソフトウェア.MySQLPostgreSQL など.

の 2 つから構成されるデータ管理のためのシステムを意味する(ことが多い,後述).これら 2 つから構成されるということを知っておけば「データベース」の全体像が把握しやすくなるはずである.

注意点

 注意点が一つある.それは,「データベース」という言葉が「DBMSのみ」を意味するのか「データベースファイル + DBMS」を意味するのかは文脈に依りけりであり,曖昧に使われることが多々あるという点である.どちらの意味でもよく使われており分かり辛いが,ここまでの内容を押さえておけば混乱せずに済むと思われる.

 本記事では,以降,「データベース」は「データベースファイル + DBMS」であることを前提に話を進める.

DBMS はユーザとデータのインタフェース

 ユーザ(データ利用者)は DBMS を介してデータベースファイルに対してデータの読み書きを行う.つまり,DBMS がデータとユーザのインタフェースとなっている

 データへアクセスする際は,DBMS に対して「〇〇のデータを下さい」と命令を送る必要がある.この命令を記述する言語が SQL*1 である.

 以上を踏まえ,データベースに格納されたデータへアクセスする手順を図と共にまとめた.処理を順に追っていけば難しくはない.

データベースに格納されたデータへのアクセス手順

(0. 目的のデータを取得するための SQL を書く)
1. ユーザから DBMSSQL を送信
2. DBMSSQL を解析(解釈)
3. SQL を実行しデータベースファイルへデータの読み書き
(4. (読み出しの場合)DBMS から目的のデータが返ってくる)

f:id:pytwbf201830:20190905020927p:plain
データベースの仕組み

(ここでは,データが表形式で管理されていることを前提としている)

 「データベース」,「SQL」という言葉が一人歩きしており,「データベース」がどのようなものかが(私のような)初学者にとって分かり辛くなっている.ここまでの説明で少しでもデータベースの仕組みが具体的にイメージできるようになれば幸いである.

データベースの種類と RDB

 データベースには,どのようにデータを格納・管理するかによって様々な種類がある.特に,表形式でデータを管理するデータベースのことを「リレーショナルデータベース」(RDB)という.表形式の他には,ドキュメント型,グラフ型などがあるが,一般的には表形式の RDB が広く使われている(前節の図RDB を表していた).

 RDB は表形式であり,行・列からなる表を用いてデータ管理を行う.データを管理する対象によっていくつかの表に分割してデータを管理するのが一般的である.例えば,「社員情報」,「顧客情報」などの表を分割するといった具合である.

 個々の表は「テーブル」とも呼ばれ,DBMS で管理される際はテーブルごとに名前が付けられる.また,表の 1 行が一つのデータに相当し(一人の社員),各列は 1 つのデータの各要素(社員番号,名前,住所など)を表す.

 表,行,列は呼び方がいくつかあるため,以下の表で把握しておくことを勧める.

RDB の要素 呼称
表(table) テーブル,リレーション
行(row) レコード,タプル
列(column) カラム,フィールド,属性

終わりに

 「データベース」という言葉の意味についてざっくりと解説してみた.「データベース」はとっつきやすいようでいて曖昧に使われることが多い言葉だと思うので,意味を正しく把握しておくことが重要である.

補足:言葉の意味

データベース(DB)

データベースとは、複数の主体で共有、利用したり、用途に応じて加工や再利用がしやすいように、一定の形式で作成、管理されたデータの集合のこと。 広義には人が紙に書いてまとめたものなどを含む場合もあるが、今日では、単にデータベースといった場合はコンピュータ上で作成、保管され、専用のソフトウェア(データベース管理システム)によって管理されるものを指すことが多い。文脈によってはデータベース管理システムDBMS:DabaBase Management System)のことをデータベースということもある。

DBMS によるデータベースは大量のデータを系統立てて保管することができ、必要に応じて検索、抽出、加工することができるため、企業の情報システムのデータ管理の中核として利用されることが多い。

データベースにはデータをどのような構造や方式で格納、管理するかによって様々な種類がある。今日最も一般的に利用されるのは「リレーショナルデータベース」(RDB:Relational DataBase、関係データベース)と呼ばれるもので、一件のデータを複数の属性の値の組として表現し、組を列挙することでデータを格納していく。属性を列、組を行とする表(テーブル)の形で示されることが多い。リレーショナルデータベースを管理するための DBMS のことをリレーショナルデータベース管理システムRDBMS)という。

引用元:データベース(IT 用語辞典 e-Words)

データベース管理システム(DBMS

データベースを構築、管理するためのソフトウェア。データベース・マネジメント・システム(DBMSともいう。代表的なものに、フリーソフトMySQLPostgreSQL、市販の製品には、オラクルの Oracle Database、マイクロソフトAccessSQL Server などがある。これらのデータベース管理システムは、サーバー上で動作し、ネットワークでデータベースを共有して複数ユーザーが同時に利用できる。データベースの作成やデータの抽出といった操作には、SQL などのデータベース言語を使用する。

引用元:データベース管理システム(ASCII.jp デジタル用語辞典)

*1:DBMS の種類によって命令を記述する言語は違うが,ここでは最も一般的な SQL を例に示した.

プロになるための Web 技術入門:その1 - Web アプリケーションとは何か,Web の発展

 Web の基本が学べる良書として紹介されていた「プロになるための Web 技術入門」という本を読み始めた.そのメモ書きとして読んだ部分から少しずつまとめていこうと思う.今回は 1,2 章の Web アプリケーションの概要,Web の発展についてまとめる.

「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか

「プロになるためのWeb技術入門」 ――なぜ、あなたはWebシステムを開発できないのか

 上記の本は非常に分かりやすく頭にすっと入ってくる表現が多い印象を受けた.また,「サーバ」,「クライアント」,「コンパイル」などの用語も平易に解説しており基礎用語の良い復習にもなる.私のような独学者にとって調べてもなかなか整理された情報が得難い部分を補完してくれる本である.

1 章:「Web アプリケーション」とは何か?

 デスクトップアプリケーションと Web アプリケーションの違いを簡単に表にまとめる.

デスクトップアプリケーション Web アプリケーション
処理の主体 手元の PC サーバ
画面の表示 OS 上で表示 Web ブラウザ上で表示
インストール 必要 不要
Word,ExcelWeb ブラウザ Amazon.co.jp,各種 EC サイト,NAVITIME などの交通アプリ

 少しややこしいが,Internet ExplorerIE),Google ChromeFirefox などの Web ブラウザ自体はデスクトップアプリケーションである. 「デスクトップアプリケーション」である Web ブラウザを通して「Web アプリケーション」を利用することになる.

2 章:Web はどのように発展したか?

 Web がどのように発展してきたかについてまとめる.

技術の発展を学ぶことの重要性

 2 章の冒頭において,著者は技術の発展について学ぶことの重要性を指摘している.

ある技術が生まれるに至った背景や流れを理解しておくと,そのあとに新しい技術が出てきても比較的すんなりと理解することができます.技術とは偶然ではなく必然をもって生まれてくるからです.その必然性を理解することが,新しい技術を素早く理解する近道となります.

また,歴史の流れは基礎から応用へと進むので,技術の歴史を理解するとその技術を体系的に理解できるようになります.

 「技術とは偶然ではなく必然をもって生まれてくるからです」という言葉は自分の頭の片隅に留めておきたい言葉.

Web の発展をざっくり学ぶ

1. インターネットの誕生と普及

  • 大学や研究機関で研究成果等を電子メールやファイルでやりとりし始めたのがインターネットの原型.
  • 「インターネット」とは,世界中のコンピュータが相互接続することによりできる通信網のこと.

2. WWW の誕生と普及

  • 電子メールやファイルでは情報共有がやりづらい.もっと良いやり方がないか?
  • そこで考え出されたのが「ハイパーテキストシステム」.これは,HTML による統一された形式による文書の表現とその文書間の参照を「ハイパーリンク」で実現するシステムである.参考文献,関連する論文資料が簡単に閲覧できるようになる.
  • 「WWW」とは,インターネット上で提供されるハイパーテキストシステムのこと.
  • WWW によるブレークスルーは,「インターネット」と「ハイパーテキストシステム」を繋げたことである.
  • 情報共有の利便性が上がる.

3. Web ブラウザの祖先 NCSA Mosaic の登場

  • 従来はテキスト(文字)のみが表示され,画像などは別のウィンドウで表示されるのが一般的だった.
  • Mosaic が開発されたことにより,テキストと画像を混在させたページを表示できるようになった.Mosaic現代の Web ブラウザの原型である.
  • Web ページの表現力が上がったため,一般の人々の興味を惹くようになった(Web の普及).
  • Mosaic をベースとして発展していったのが現在の IEGoogle Chrome などのブラウザである.

4. Web を支える技術の発明

  • クライアント・サーバシステム
    • WWW によるハイパーテキスト(動画などを含めるとハイパーメディアともいう)の公開と閲覧は,クライアント・サーバシステムで実現されている.
  • リソースの場所はどこ?:URL
    • 「URL」とは,ホストコンピュータ,リソースのインターネット上での位置を示す文字列のこと.
    • 「リソース」は,インターネット上で送受信される HTML などの情報のこと.Web ページに表示される画像,動画などもリソースの一部である.
    • 「ホストコンピュータ」はリソースが保存されているコンピュータのこと.Web の文脈では Web サーバのこと.
    • URL は,「スキーム + ホスト名(ドメイン名) + パス名」からなる.
  • リソースを送受信するための取り決め:HTTP
    • ハイパーテキストなどのリソースを異なるコンピュータ間でどうすればやり取りできるかという問題が出てきた.
    • Web サーバと Web クライアントが情報をやり取りするための取り決めをするのが「通信プロトコル」であり HTTP である.

5. CGI の登場

  • 静的なページではつまらない -> プログラムで動的なページを作れないか?というのが CGI の始まり.
  • CGI」は Common Gateway Interface の略で,Web サーバと外部プログラムを連携するためのインタフェースのこと.
  • CGI により,Web サーバ上で外部プログラムを動作させ,動的な Web コンテンツの生成ができるようになった
  • 例えば,Web サイトのアクセス数,時刻に合わせたメッセージなどコンテンツにちょっとした変化を加えることができるようになった.

6. Java / サーブレットの登場

  • CGI の問題点
    • CGI で主に使われていた言語である Perl は大規模アプリケーションの開発に向いていなかった.
    • CGI 経由でプログラムが呼ばれる度に新しいプロセスが起動されるため,アクセス数が多くなるにつれて処理が追いつかなくなる.
  • Java / サーブレットの登場
    • Javaオブジェクト指向のフルサポート,その他標準機能(マルチスレッド,セキュリティ,ネットワーク通信)が豊富で大規模システムの開発がやりやすい.
    • サーブレット」は HTML などの Web コンテンツを生成するための Java プログラムのこと.Java プログラムの中に HTML を文字列として埋め込む
    • Web サーバと同じプロセスでコンテンツを生成するプログラムが動作するため比較的高速.
    • JVM によるクロスプラットフォームでの Java プログラムの動作の実現.

7. JSP の誕生

8. Web アプリケーションフレームワークの時代

  • サーブレットJSP ではコーディング量が膨大で,成果物のつなぎ合わせ時の不整合が起こるなど大規模な Web アプリケーションでのソースコードの管理が非常にしづらい.
  • Web アプリケーションに関する共通部分,土台となる部分を「フレームワーク」が担うようになり,開発効率が格段に上がった.

用語説明

  • コンテンツ
    Web サーバを通じて公開される情報.

  • ユニーク unique
    「一意な」という意味.「面白い」ではない.

  • プロセス
    コンピュータで動作するプログラムの単位.Web サーバと動的コンテンツを生成するプログラムは異なるプロセスである.

  • マルチスレッド
    複数の処理を同時に実行するための仕組み.実際には同時実行ではなく,短時間で複数の処理を少しずつ切り替えながら実行することにより見かけ上同時実行がなされているように見える.

  • コンパイル
    プログラムを翻訳すること.通常のプログラミング言語は人間が読めるように記述でき,コンピュータはその意味を解釈することができない.そのため,プログラムを実行するためにプログラムをコンピュータが理解できる命令(機械語)に変換する作業が必要になる.この変換作業のことをコンパイルと呼び,変換作業を行うソフトウェアのことをコンパイラと呼ぶ.

  • コンパイル言語
    コンパイルが必要な言語.ソースコードを先に全て翻訳するためプログラムが高速に動作する.C 言語など.一括翻訳

  • インタプリタ言語
    ソースコードインタプリタで逐次機械語に変換しながら実行する言語.逐次翻訳するという性質上,コンパイル言語より動作が遅い.PerlPython など.逐次翻訳Javaインタプリタ言語とコンパイル言語の中間に位置する.

  • プラットフォーム
    ソフトウェアを動作させるハードウェアと OS の組み合わせのこと.

終わりに

 かなりざっくりだが Web の発展についてまとめてみた.「なぜこの技術が存在するのか」という視点は新しい技術を学ぶ際に非常に重要だと思うので定期的にこの問いかけを思い出すようにしたい.冒頭で紹介した本は Web 開発の初学者にとっても分かりやすく,知識の整理をするのに役に立つと思うのでおすすめ.

PostgreSQL チートシート

 PostgreSQL でよく使うコマンドをまとめました.↑ の目次から探してください.これよく使うぞってのあったら教えてくださると幸いです.随時更新していきます.

コマンドの説明

 本記事内の各コマンドは,実行する環境で表示を分けている.環境はシェル環境DB 対話環境の 2 つで,以下の様に分けられている.

  • シェル環境(筆者は bash)でのコマンド:$ で始まるコマンド
  • PostgreSQL 対話環境でのコマンド:# で始まるコマンド

 なお,$ で始まるコマンドの出力は #>>># で始まるコマンドの出力は -- で表しているため注意.

筆者の開発環境

psqlPostgreSQL 付属の DB 対話環境のこと.

バージョンの確認

  • シェル環境
$ psql --version
#>>> psql (PostgreSQL) 11.3
  • 対話環境
# select version();

ヘルプの表示

  • psql コマンドに関するヘルプ
$ psql --help
  • 対話環境で使える内部コマンド(\ で始まるコマンド)のヘルプ
# \?
  • 対話環境で使える SQL コマンドに関するヘルプ
    コマンドを付け加えることでそのコマンドのヘルプが見れる.
# \h
-- SQL コマンド一覧が表示される

# \h [sql-command]
-- コマンドに関するヘルプ

# \h alter
-- alter に関するヘルプ

DB サーバの起動・停止

  • シェル環境
$ pg_ctl -D /usr/local/var/postgres start
$ pg_ctl -D /usr/local/var/postgres stop

DB 一覧を表示

  • シェル環境
$ psql -l
  • 対話環境
# \l

対話環境への入り方

 psql コマンドに 3 つのオプション -d-U-h-W をつけて実行することで,任意の DB の対話環境に入ることができる.

  • -d:DB を指定(未指定でログインユーザ名の DB に入る(macOS の場合,ホームディレクトリのユーザ名))
  • -U:ユーザーを指定(未指定だとログインユーザ(macOS の場合,以下略))
  • -W:パスワードを指定(要設定).
  • -h:ホスト名(未指定だと localhost)

DB を指定して対話環境へ入る

 psql -l で名前を確認してから [db-name] の部分に DB の名前を入れる.インストール時にデフォルトで postgres という名前の DB ができているため,始めはそれで入っても良い.

$ psql -d [db-name]
$ psql -d postgres  # デフォルト

DB,ロールを指定して対話環境に入る

「ロール」は「ユーザ」という意味で解釈して良い.それぞれのロールに対して権限を与えることができ,特定の DB へのアクセスの制限などが行える.

ユーザ一覧を表示

 どんなユーザが存在するか分からない場合,デフォルトの DB postgres の対話環境に入ってユーザ一覧を見る.

$ psql -d postgres
# \du
-- ユーザ一覧の表が表示される

 デフォルトではログインユーザの名前で全ての権限を持つユーザが作られている.筆者の場合は以下のように表示された.pyteyon がデフォルトで作られたユーザ,nukopy が新しく作ってみた何の権限も持たないユーザである.

# \du

--                                    List of roles
--  Role name |                         Attributes                         | Member of
-- -----------+------------------------------------------------------------+-----------
--  nukopy    |                                                            | {}
--  pyteyon   | Superuser, Create role, Create DB, Replication, Bypass RLS | {}

DB,ユーザを指定して対話環境に入る

 -d-U(U は大文字)オプションを使う.

$ psql -d [db-name] -U [user-name]

 各ユーザに設定したパスワードが必要な場合は末尾に -W オプションを付けるとパスワード入力を求められ,入力すれば対話環境に入れる.

$ psql -d [db-name] -U [user-name] -W

 筆者の環境での例を以下に示した.

$ psql -d postgres -U nukopy -W
Password:  # 表示されないけど入力
psql (11.3)
Type "help" for help.

postgres=>  # 入れた

対話環境から出る

# \q
-- シェル環境へ戻る

ロール一覧を表示

  • デフォルトで作られる DB postgres の対話環境に入ってからロール(ユーザ)一覧を見る.
$ psql -d postgres
# \du
-- ロール一覧の表が表示される

ロールにテーブルやビューなどに対する権限を追加する

DB の作成,消去

  • シェル環境:createdbdropdb
$ pg_ctl -D /usr/local/var/postgres start
$ createdb [db-name]
$ psql -l  # 作成できているかの確認
$ dropdb [db-name]
$ psql -l  # 消去できているか確認
  • 対話環境:create databasedrop database
# create database [db-name];
-- CREATE DATABASE
# \l  -- データベース一覧.作成できているかの確認.
# drop database [db-name];
-- DROP DATABASE
# \l  -- 消去できているかの確認.

接続中の DB の情報を確認

 対話環境に入った後,今自分がどのロールでどの DB を操作しているかを確認する.

  • 現在接続中の DB の情報を確認(簡易)
# \c
-- You are now connected to database "[db-name]" as user "[user-name]".
  • 現在接続中の DB の情報を確認(詳細)
# \conninfo
-- You are now connected to database "[db-name]" as user "[user-name]" via socket in "[socket の場所]" at port "[post-number]".

他の DB への切り替え

# \c  -- 現在の DB を表示
# \c [db-name]  -- 切り替え
# \c  -- 切り替えが出来ているか確認

テーブル操作に関するコマンド

 ここからは特定の DB の対話環境に入っている前提で話を進める.

テーブル一覧を表示

# \d

テーブルのスキーマを表示

 テーブルのスキーマ(各フィールドのデータ型,制約やテーブル作成時の SQL クエリなど)を表示させることができる.

# \d [table-name]

 例えば,筆者が Python の Web フレームワークDjangoチュートリアルで作成したテーブルは以下のように表示された.

# \d polls_question  -- "polls-question" というテーブル名

-- Table "public.polls_question"
--     Column     |           Type           | Collation | Nullable |                  Default
-- ---------------+--------------------------+-----------+----------+--------------------------------------------
--  id            | integer                  |           | not null | nextval('polls_question_id_seq'::regclass)
--  question_text | character varying(200)   |           | not null |
--  pub_date      | timestamp with time zone |           | not null |

Indexes:
    "polls_question_pkey" PRIMARY KEY, btree (id)
Referenced by:
    TABLE "polls_choice" CONSTRAINT "polls_choice_question_id_c5b4b260_fk_polls_question_id" FOREIGN KEY (question_id) REFERENCES polls_question(id) DEFERRABLE INITIALLY DEFERRED

シェル環境から特定の DB に対して SQL を実行

$ psql [db-name] -c "[query]"

例:company という DB の employee というテーブルを出力する.

$ psql company -c "select * from employee;"

その他

  • コマンドの履歴の表示
# \s
-- 今まで実行したコマンドの履歴

更新履歴

  • 2019/08/24 記事投稿