トップ  一覧  単語検索  最終更新  バックアップ  ヘルプ 

■発言まわりについて

       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とのコネクションはつなぎっぱでやってる。
トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS
PukiWiki 1.4.7 Copyright © 2001-2006 PukiWiki Developers Team[外部リンク]. License is GPL[外部リンク].
Based on "PukiWiki" 1.3 by yu-ji[外部リンク] Powered by PHP 5.3.3