PostgreSQLで便利な配列型を使ってテーブル構築 | その1 配列型とは?

No Commented 月曜日, 6月 15th, 2009

Under: PostgreSQL

最近PostgreSQLを使ったシステム構築をしているのですが、配列型がとてつもなく便利です。
「配列型って何?」という方(私も前までそうでした・・・)にも、オススメしたい配列型の話をちょこちょこと書きたいと思います。

1.配列型とは

配列型とは、PHPではおなじみですし他の言語でも大概ある変数型の1つです。
大きな特徴はひとつの変数内に複数の情報を格納できる事

<?php
$_arr_test = array('1','2','3');

$_arr_test2 = array(
'11' => 'Jack',
'12' => 'Queen',
'13' => 'King'
);
?>

この配列型をPostgreSQLでも定義可能です。
定義する際は、CREATE TABLE時に以下のような型でカラムを追加すればOK。

CREATE TABLE ARR_TEST
(
id  integer  NOT NULL,
arr_test  integer[],
arr_test2  character varing(10)[]
)

2.配列型の特徴

先ほども書きましたが、配列型の特徴はひとつのカラムに複数の情報が含められるという事です。
これは、データーベースの基本である「正規化」をする際に、あえて「非正規化」をするという事で成り立つ技です。

例えば、あるユーザー情報を管理するシステムがあるとします。こんなテーブル。

CREATE TABLE USER
(
id  integer  NOT NULL,  --ID
lastmod  timestamp  NOT NULL,  --最終更新日
password  character varing(20)  NOT NULL,  --パスワード
CONSTRAINT pk_user_id PRIMARY KEY (id)
);
CREATE TABLE USER_REL
(
rel_id  integer  NOT NULL,
user_id1  integer  NOT NULL,
user_id2  integer  NOT NULL
);

このシステムはユーザーごとにパスワードと最終更新日を保持するUSERテーブルと、ユーザー同士が友達の場合にその友達情報を記憶するUSER_RELテーブルが存在します。
ユーザーが、友達申請をすると、USER_RELのuser_id1に自分のID、user_id2に友達のIDが記録されるような感じです。
このIDはユニークなので、こういう風な情報を持つことで友達一覧等を出す事が可能になります。

しかし、このテーブル構造には後々問題になりそうなところが1つ。

  • 1対1のユーザー関係しか記録できないので、グループ機能などは作れない(user_id1とuser_id2しかないので)
  • 友達が一杯登録されるとUSER_RELテーブルが爆発的に増える(JOIN,SELECT時にやたら重くなる)

このような問題を抱えてしまっていると、後々の機能拡張時にDBの再設計が入ってきます。(例えばテーブル分割など)
また、例えば以下のようなSQLをユーザー数が増えて使うと重くなります・・・。

--IDが100のお友達リストを出力するSQL
SELECT user_id2
FROM USER_REL
WHERE user_id1 = '100';

これを回避するためにも、「配列型」を用いる事で、もっと柔軟なシステム構成にしてしまいましょう!
上記のテーブルを以下のように作り変えます。

CREATE TABLE USER
(
id  integer  NOT NULL,  --ID
lastmod  timestamp  NOT NULL,  --最終更新日
password  character varing(20)  NOT NULL,  --パスワード
frend_id_arr integer[]  NOT NULL,
CONSTRAINT pk_user_id PRIMARY KEY (id)
);
CREATE TABLE USER_REL
(
rel_id  integer  NOT NULL,
user_id_arr  integer[]  NOT NULL,
user_id_type  integer  NOT NULL
);

USERテーブルとRELテーブルに双方配列型を作りました。
USERテーブルのほうにある配列型は各ユーザーが登録した友達のユーザーIDリストを入れます。
USER_RELのほうにある配列型は友達関係にあるユーザーIDを入れます。また、typeはその関係性を種別するためのテーブルです。

こう変えることで、自分の友達IDリストを取得するのは以下のようなSQLでOKです。

--IDが100の友達IDを取得
SELECT frend_id_arr FROM user WHERE id = '100';

また、USER_RELテーブルは複数のIDを受け付けられるようになったので、複数人のつながりを記録する事が出来るようになりました!
もし、配列型を使わないと、このつながりの人数を制限して、カラムをその人数分作って・・・という作業が必要になりますが配列型を使えば「未定の数」に対応が可能です!

とりあえず、簡単に配列型に関する説明のさわりを書きましたが、まだまだ配列型の魅力はたくさんあります。
次回、配列の問い合わせ方法や配列が早くできる理由をアップ予定。

Eclipse(PDT)で、PHPのタスクタグが効かなくなる件。

No Commented 金曜日, 6月 12th, 2009

Under: PHP

未だに私がEclipse3.3を使う理由がこれなんです。

どうしてもPHP以外の拡張子でプログラムを組んでいる場合、コンテンツタイプのPHPにその拡張子を紐付けるじゃないですか。
それでソースを書いていて、タスクタグを結構書きながらプログラムするんですよ。

<?php
//TODO  データが複数来る場合の対応を追記予定
?>

こんなの。

で、こういう風に書くとEclipseってタスクという所に自動でこの中身が一覧表示されるので、未実装部分とか懸念点部分を列挙しておけば後で改修も楽なんです。

この機能が使えない。追加した拡張子に対して。

バグかなーとか思って、EclipseのBugzilla見てみたらなんか該当してそうなのが・・・。

Eclipse Bugs – Tasks Tags don’t work in user added php file types

やっぱりバグなのか・・・。そしてステータスが終わって無いという事はまだ放置ですか。
EclipseのPDTやめて違うやつ使うかな・・・。

プロ野球チームをつくろう!2が面白い。

No Commented 月曜日, 5月 25th, 2009

Under: 日記

5月22日(金)に発売されたNDSソフト「プロ野球チームをつくろう!2」が楽しい。

前作同様サクサク感は損なわず、いい感じで進化。
シーズンモード/通年の記録を残す(ただし1位のみ・・・)ようになったり、イベントが増えたりとまぁ若干不満はありますがいい進化。

そして激しく面白いのが「野球つくJapanモード」!
これはドリームチームを作ってチーム同士で戦うというモード。

まず自分含め4つのチームが作られ、ベースとなる球団を選択。
するとベース球団の主力以外の選手が自チームに入る。

この後、CPUも含め4チームで現存選手の中からドラフト(10順目まで)をして自分達のチームを作る。
現存選手のリストはランダムで決まるので、必ずしもダルビッシュが出るとかそういう事は無い。
だからこそ、今回のドラフトの目玉はこいつだ!と思って取ると競合してくじ引き・・・とか駆け引きが面白い。

出来たチームを使って他の3チームと総当り戦をするのですが、ライバルに勝つとなんと、敵チームから選手を引き抜き出来るという(笑)
逆に負けると引き抜かれるのでハラハラドキドキ。

一定以上の成績を収めると、そのチームで世界戦が出来たり、世界戦で活躍すると普通のモードで進めているチームにアイテムをあげる事ができたりと結構いい感じ。
ちなみに初期チームのオススメは西武。なんせ銀仁朗いますから・・・。
Japanモードは更に通信対戦できるってのが面白いですよねー。

ちなみに、今のシーズンモードのうちのチーム。最初西武を選びました。
やっと日本一になれました(4年目)
5年目は常勝軍団を作るべく超大幅補強!

1番にはイチロー、3番栗山、4番中村(おかわり)、5番ブーマー!、6番落合(新人)と超強力HR打線w
中村が1シーズン59HRを放った翌年なので、今年もこのペースで打ってくれればテラマシンガン打線w
あとは清原来たら完璧だな・・・w
キャッチャーは育った銀仁朗と偶然ゲットできた野村監督w

ただ、中継ぎ陣が手薄の粋を超えていて酷いwそれなりな選手だと思ったんですが、7~9回に打たれこむ凄さがw
先発だけはマー君、由規、涌井、岸、稲尾とかなり豪華なんですがね・・・。
抑えはつくろう選手のウォズニアック。これもまだ成長途中だけど強引に投下。

あ、監督は渡辺久信監督のままですよ。なんか変えられない。

是非会社に置きたい商品が出た。「ガチャガム」

No Commented 金曜日, 5月 22nd, 2009

Under: ニュース

コレは欲しい。
ボトルガムガチャガチャマシーン!!

出たら買おう。

concrete5 日本語版をCORESERVERにインストール

No Commented 日曜日, 5月 10th, 2009

Under: 日記

次世代CMSとして、密かに脚光を浴びているconcrete5。
いつの間にか日本語版ができあがってました。

concrete5日本語公式サイト by Usagi Project:

で、このブログが動いている鯖でもあるCORESERVER(XREA)にこれを入れてみました。
若干やはり癖があるので、初心者は躓くかも・・・。と言うことでインストールメモ。
基本は上記公式サイトのインストール手順に従って下さいよー。

Read more »

最近の近況報告

No Commented 日曜日, 5月 10th, 2009

Under: 日記

GWも過ぎ、やっと通常生活に落ち着いてきました。

最近めっきり更新するのを忘れていてちょっと反省。

とりあえずやったことはConcrete5をCORESERVERに設置してみた。
ちょっとはまりますねこれ。

あとでエントリつくっておきますわー。