午後。
最近、イベントベースのサポートチケットシステムの開発を任されましたが、多くの問題が発生しており、問題はデータベースの構造にあると思います。
現時点では、次のようになっています。
create table tickets (
ticket_id int not null primary key auto_increment,
stage_id int not null default 0,
name varchar(255) not null default ''
/* etc... */
);
create table ticket_events (
event_id int not null primary key auto_increment,
ticket_id int not null,
date datetime,
stage_id
);
create table stages (
stage_id int not null primary key auto_increment,
name varchar(255)
);
したがって、チケットがステージを変更するたびに、チケットが移動したステージとタイミングを指定する新しい行がticket_eventsテーブルに追加され、チケットテーブルのstage_idフィールドが新しいステージで更新されます。
問題は、チケットの現在のステージがtickets.stage_idとticket_eventsテーブルの最新のレコードの両方で定義されているため、これがデータベースの正規化ルールに違反することです。ある時点での未処理のチケットの数を示すレポートを作成しようとしたところ、なぜこのようになっているのかがわかりました。イベントテーブルから現在のステージをすばやく取得するために、どのような種類のSQLも取得するのは非常に難しいようです。
この非常に役立つページ(http://kristiannielsen.livejournal.com/6745.html)でオプション2を使用して適度に高速なクエリを作成できましたが、問題が発生して行き詰まりました。
現在のデータでは、event_idは常に日付に対して昇順で実行されるとは限りません。さらに、特定の自動処理スクリプトにより、1つのチケットにまったく同じ日付の2つのイベントが含まれる可能性があります。つまり、イベントテーブルを使用しようとするクエリは、「日付順、event_id」である必要があります。これは、サブクエリやグループ化ではほとんど不可能です。
これらの問題を克服するために私がどのように取り組むことができるかについて誰かがアドバイスを与えることができますか?イベントの順序を定義するより良い方法はありますか?
どうもありがとう。サイモン