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

■発言まわりについて
        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