EatSmartシステム部ブログ

ウェブサイトの開発や運営に関する情報です。

イベント情報のテーブル設計で考えたことまとめ

タスクの趣旨

弊社サービスのもぐナビでは、様々なイベント、キャンペーンなどをオンライン、オフライン問わず実施しています。開催イベントの一覧が情報として見れるといいよねということで、新らたにイベント情報をもつテーブルの設計を考える機会がありました。
【過去の実施イベント例】
もぐナビベストフードアワード2018
カップ麺選手権
もぐナビ試食会

以上の背景を踏まえて、実際に作成したスキーマが下記になります。
(PostgreSQLを使用)

※⑴CREATE SEQUENCE seq_event;

CREATE TABLE m_event(
event_id        NUMERIC(13, 0) DEFAULT ※⑵nextval('seq_event') PRIMARY KEY,
event_title     character varying(128) NOT NULL,
event_url       character varying(128) NOT NULL,
information_start_date  TIMESTAMP WITHOUT TIME ZONE NOT NULL,
information_end_date    TIMESTAMP WITHOUT TIME ZONE ※⑶DEFAULT '2100/12/31',
※⑷new_end_date TIMESTAMP WITHOUT TIME ZONE NOT NULL,
event_label CHAR(2) NOT NULL DEFAULT '01',
picture_path1   character varying(128) NOT NULL,
picture_path2   character varying(128) NOT NULL,
upd_date        TIMESTAMP WITHOUT TIME ZONE,
ins_date        TIMESTAMP WITHOUT TIME ZONE DEFAULT NOW(),
del_kbn         CHAR(2) DEFAULT '01');

COMMENT ON COLUMN m_event.event_label IS '01:イベント';
COMMENT ON COLUMN picture_path1  IS '300x250';
COMMENT ON COLUMN picture_path2  IS '320x100';

※⑸CREATE INDEX idx_m_event ON m_event(information_start_date);

設計する過程で、考えたことについて内容を振り返ってみます。

INDEXについて

event_id(イベント固有に振られるID)が主キーの扱いとなるため、自動的にインデックスが貼られます。それに加えて、掲載した時期を元にイベント表示をしていくので掲載開始時期(information_start_date)についてもインデックスを貼ります※⑸。

シーケンスについて

event_idに対し、連番で固有の番号を割り振るため、シーケンスオブジェクトという特別なテーブルを作成します※⑴。 ※⑵でシーケンス関数を利用し、シーケンスオブジェクトの値を次に進めその値を返す、つまり自動で採番していく処理を行います。

NOT NULL制約について

イベントに関する基本情報は、デフォルトでNOT NULLにしておきます。イベントの掲載開始時期(information_start_date)は、全て必要になるためNOT NULL制約をつけますが掲載終了時期(information_end_date)は制約を外しました。これは、終了期間を未指定で掲載するケースもあるためです。何も入力しない場合には適当な年月日※⑶が自動で入るようにしてあります。

New!(新着アイコン)の表示について

新着のイベントにNEW!アイコンを表示します。掲載開始開始から一定期間経過後、非表示とする必要があるため、※⑷new_end_date(NEW!表示終了日)を設けて対応することにしました。当該期間とnew_end_dateの差が0以上なら、NEW!をつける、そうでないならNEW!をはずすというメソッドを作り、VIEW側でアイコンの出しわけを行いました。

truncate処理について

上記のイベント実装に関連し、テストコードの実装を行いました。その中でtruncate処理を知りました。 truncateは、deleteと違い、テーブルスキャンを行なわいため、テーブルの削除が高速で実行できます。下記※⑹で、イベントのテーブルデータを一度削除し、再作成するということをセットアップ処理の中で行っています。

public class EventBeanTest {
    @Before
    public void setUp() throws ServerException {
        TestManager.getInstance().initialize();
        DBConnectionManager.getInstance().getConnection().execute(※⑹"truncate m_event ");
    }

以上となります。