2010年7月20日火曜日

DBおほへ書

このごろ晴れが続くなぁ、と思っていたら、梅雨が明けているとかいないとか。
異常気象という気はありませんが、わかりづらい気候ですね。
とりあえず、脱水対策として家の冷凍庫の氷を量産しようと思います。
アイスティーを淹れるとすぐに氷がなくなるもので^^;

さて、本日のタイトルの元ネタは戦国モノです。
タイトルと内容はほとんど関係ありません。


DB(データベース)というのは、とても重要な割に理解している人が少ないものだと思います。
かく言う筆者自身、製造工程で使用する為のDBサーバくらいならなんとかかんとか作れなくもありませんが、実環境(実際にユーザが使用する環境)のDBサーバは厳しいです。
何が一番大変かと言うと、データが過不足なくリアルタイムに正しく存在しなくてはならない(しかもシステム稼働中を通してずっと)のです。
中身を理解していないとそんな保証はできないです。

大半のSEが基本的なSQL文(DBを操作するおまじないと思っておけばOKです)が書ければそれで良いと思っている昨今ですが、筆者はある課題の為に調べ物漬け状態になっています。
その過程で出てきた話をちらっと書いてみようと思います。


一番単純なDBには、テーブルと呼ばれるデータ格納領域だけが存在します。
テーブルとは何ぞ? といいますと、エクセルで作った表のようなイメージを持っていただくと良いかもしれません。
カラム(列)が幾つかあって、レコード(行)を構成する。
たとえば、名簿なんかがわかりやすいですが、学籍番号・氏名・備考、という3つのカラムが存在し、学生一人につき3つのカラムそれぞれに情報が入ったレコードが1つ作られます。

実際のDBでは、テーブルとテーブルの関係(上記の「名簿」テーブルの学籍番号と、A講座の成績表テーブルの学籍番号を関連付けることで、A講座の成績表に学生の氏名が登録されていないのに『**さんの成績は【A】です』という情報が得られる)が重要なのですがその辺はそこらへんの解説サイトなどにお任せします。
数学の集合論なんかと絡めても面白いのでしょうけどマニアックすぎるので^^;

では、単純じゃないDBとは? というと、その一つとして「他のDBから情報を参照する」というのがあります。
社内で昔から使っているシステムのDBから必要な情報を取得したい、という場合などが該当しますが、この時に新しいシステムから比較的簡単に情報を参照する方法が【view】です。

えー、現役SEの中からは「viewは複数のテーブルの情報をまとめるものだろ?」などと突っ込まれそうですが、その用途は無論正しいです。
しかし、viewは他のDBの参照が(恐らく)一番簡単に出来る手段でもあるのです。


~サンプル(始)~
CREATE OR REPLACE VIEW 【view名】 AS 
 SELECT dblink.【参照したいカラム名】
   FROM dblink('host=【ホスト名】 port=【ポート番号】 dbname=【DB名】 user=【ユーザ名】 password=【パスワード】'::text, 'select * from 【参照したいテーブル名】;'::text) dblink(【参照したいカラム名】 【カラムの型】);
~サンプル(終)~

はい、何のことやらな方もいるかと思われますが、これが他のDBを参照するviewを作るSQL文です。
ちょっと手抜きでPostgresのビュー定義からコピペしてしまいましたのでわかりづらいところがあるかもです。
簡単に説明しますと…

CREATE OR REPLACE VIEW 【view名】:CREATE VIEWの直訳でわかるように「【view名】という名前のVIEWを作る」という意味です。

SELECT 以下:SELECT カラム名 FROM テーブル名 が参照のSQL文の基本になります。そういうものだと思ってください。

SELECT dblink.【参照したいカラム名】:「dblinkテーブルの【参照したいカラム名】カラムの情報を取得する」という意味です。

FROMは長めなので分割して…
dblink('host=【ホスト名】 port=【ポート番号】 dbname=【DB名】 user=【ユーザ名】 password=【パスワード】'::text, :【ホスト名】というホスト(DBサーバ)に【ポート番号】番ポートからアクセスして、【DB名】というDBに【ユーザ名】と【パスワード】でログインする、という意味です。

 'select * from 【参照したいテーブル名】;'::text):dblinkした先で実行したい参照用SQL文です。

dblink(【参照したいカラム名】 【カラムの型】);:取得したいカラム(情報)の一覧です。カラム名と型(文字列なのか? 数値なのか? 日付なのか? などなど)が必要です。

まとめると
『dblinkで接続した先のテーブルから、指定したカラムの情報を取得して参照する』
となります。
まとめるときに切り捨てた部分が技術的に重要だったりしますが、そこまで入れるとサンプルのSQL文が一番シンプルと言う^^;
SEの会話は宇宙語だ、と思う人もいるようですが、このへんの感覚が理由なのかな?


自分用の覚書兼同じ悩みを持っている方の指針となれば、という記事でした。

0 件のコメント:

コメントを投稿