2011-07-18 15 views
0

午後すべて。MySQLイベントベースのサポートチケットシステム

私は最近、イベントベースのサポートチケットシステムに取り組んでいますが、私は多くの問題に遭遇しました。問題はデータベース構造だと思います。チケットの変更がステージたびだから、新しい行が、それはに移動した段階ticket_eventsテーブルの指定、およびstage_idフィールドに追加され

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.stage_idとticket_eventsテーブルの最新のレコードの両方で定義されているため、データベースの正規化ルールが破損するという問題があります。いつの時点でも未払いのチケットの数を示すレポートを書く私の試みで、私はそれがなぜこのようなのかを発見した。イベントテーブルから現在のステージをすばやく取得するために、あらゆる種類のSQLを取得することは非常に難しいようです。

この非常に役立つページ(http://kristiannielsen.livejournal.com/6745.html)で、オプション2を使用して合理的に高速なクエリを作成することができましたが、私は問題を抱えていました。

現在のデータでは、event_idが日付に対して常に昇順で実行されるわけではありません。さらに、特定の自動化された処理スクリプトのために、1つのチケットが正確に同じ日付の2つのイベントを持つ可能性が非常に高い。これは、イベントテーブルを使用しようとするクエリが、サブクエリやグループ化ではほとんど不可能な「日付、イベントID順」を必要とすることを意味します。

誰も私がこれらの問題を克服する方法についてアドバイスをいただけますか?イベントの順序を定義する良い方法はありますか?

多くのありがとうございます。 Simon

+0

編集:特に、特定の時点でチケットのステージを効率的に取得する方法に焦点を当てたいと思います。異なるデータベース構造を使用するソリューションの例も高く評価されます。 – SystemParadox

答えて

0

ticket_stage_idをFKでticket_eventsテーブル(last_event)に置き換え、新しいイベントが挿入されるたびに、events.last_eventフィールドをイベントのPKに更新します。これにより、イベントテーブルから現在のステージを簡単に簡単に見つけることができます。

0

正規化ルールはガイドラインです。彼らは多くの状況で適用されますが、すべてではありません。ルールを「違反する」ことは自動的に悪いことではありませんが、すべての状況でスラブに従うことは間違いなく悪いことです。

道路のルールと同じように考えてください - 速度制限に常に従ってください、道路の側にいてください...しかし、いつもそれらのルールに従えば、もう片方の車線に乗り込んでしまったときに、自分の車と物理的にマージします。

0

これを行うもう1つの方法は、チケットテーブルに「次のイベントID」を設定することです。イベントを作成するときは、イベントを使用して更新します。独自の独立した注文を設定することができます。また、「優先度」フィールドを持つこともできます。これは、日付/時刻が同じ場合の2次的な順序として機能します。

正確な要件についてもう少し考える必要があるようです。

関連する問題