トップ 一覧 単語検索 最終更新 バックアップ ヘルプ |
■発言まわりについて
Aileron:DB@postgresql create table message_XXXX ( day int not null, 4 バイト整数 no int, 4 バイト整数 type int, 4 バイト整数 id varchar(16), 可変長文字列 message varchar(512) 可変長文字列 time not null default date_trunc('second'::text, now()) ) こんな感じ。んでポスグレだと、連番作成にSEQUENCEを使うって所。 キャラクターテーブルは CREATE TABLE char_tbl ( char_id character varying(16) NOT NULL, char_img character varying(64), char_name character varying(32), char_type integer DEFAULT 0 NOT NULL )
村管理用のテーブルはこんな感じ 便宜上ルームテーブルってしてる。 CREATE TABLE room_tbl ( room_id character(4) NOT NULL, room_name character varying(32) NOT NULL, message character varying(256), room_max integer DEFAULT 8 NOT NULL, room_type integer DEFAULT 0 NOT NULL, char_type integer DEFAULT 0 NOT NULL, update_interval integer DEFAULT 0 NOT NULL, update_interval_time time without time zone DEFAULT date_trunc('minute'::text, now()) NOT NULL, active_flag boolean DEFAULT false NOT NULL, create_time timestamp without time zone DEFAULT now() NOT NULL, turn_number integer DEFAULT 0 NOT NULL )
発言のインサートには INSERT INTO message_$roomId$ ( day,id,message,no,type ) VALUES ( (SELECT turn_number FROM room_tbl WHERE room_id = #roomId#), (SELECT user_id FROM user_tbl WHERE session = #sessionId#), #message#, nextval('white_message_$roomId$') - 1, *1 0 ) *1シーケンスから次の値を取得する。一引く理由は、シーケンスが1から始まっているから 0始まりにしたい為に1引いてる。 こんな感じで、room_tbl から日付の取得と、user_tblからセッションをひもづけて IDを取得して、やるって感じで作ってる。態々サブクエリー使うほどの事じゃないから 表結合してやった方が良いのかも。 発言の取得には、ユーザーテーブルとキャラクターテーブルとメッセージテーブルを結合して 表示。(message.type 0通常 1独り言 3アクションとなってる。
SELECT message.message as message, char_tbl.char_name as name, char_tbl.char_img as img, message.time as time, message.type as type, message.no as no FROM user_tbl, char_tbl, message_$roomId$ as message WHERE ( message.type = 0 or message.type = 3 ) and message.id = user_tbl.user_id and user_tbl.char_id = char_tbl.char_id and message.no >= (#page# * 10) and message.no <= (#page# * 10 + 10) and message.day = #day# or message.type = 1 and user_tbl.session = #session# and message.id = user_tbl.user_id and user_tbl.char_id = char_tbl.char_id and message.no >= (#page# * 10) and message.no <= (#page# * 10 + 10) and message.day = #day#
何となくメッセージ用のテーブルは村毎に分けてある。終了した時点で 村テーブルをDropしてHDの空きを確保する為と、全村を一テーブルにすると テーブルが大きくなって検索効率が悪くなってスピード落ちるから。 DropとDeleteでDBに対してのインディックスがごちゃごちゃするとかは どんな風に絡むのか良く判らんが、デリートはあんましやりまくると良くないっぽいと思ってる。 んで、バカスカSQL投げたり、DBとのコネクションはつなぎっぱでやってる。