- 追加された行はこの色です。
- 削除された行はこの色です。
*人狼審問Replace [#y7c7c35c]
javaで開発。ヒトリでカイハツ。~
@author Aileron
*■発言まわりについて [#la275cbc]
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とのコネクションはつなぎっぱでやってる。