1

うまくいけば、私の説明はタイトルよりも少し良くなりますが、基本的には新しいアプリケーションスキーマの一部に問題があり、テーブル構造で最も管理しやすくエレガントなソリューションに固執しています。

関連するフィールドのみが表示されているベアボーンテーブル構造は次のようになります。

航空会社(id、name、...)
ホテル(id、name、...)
サプライヤー(id、name、...)
event(id、name、...)
eventComponent(id、name){eg Food Catering 、Room Hire、Audio / Visual ...}
eventFlight(id、eventid、airlineid、...)
eventHotel(id、eventid、hotelid、...)
eventSupplier(id、eventid、supplierid、hotelid、eventcomponentid、.. .. )。

したがって、航空会社、ホテル、サプライヤーはすべて参照テーブルであり、イベントはこれらの参照テーブル間の1対多の関係で作成されます。たとえば、イベントには2つのフライトエントリ、3つのその他のコンポーネントエントリ、および2つのホテルエントリが含まれる場合があります。ただし、問題は、EventSupplierテーブルでは、サプライヤーがサプライヤーまたは既存のホテルのいずれかである可能性があることです。したがって、ユーザーがフロントエンドで新しいイベントを作成した後、後でこのデータを返すのが悪夢にならないように、これを保存する必要があります。

私はポリモーフィックな関係と排他的なアークについて多くのことを読んでいます、そして私のシナリオは間違いなく線に沿っているか、排他的なアークの関係だと思います。

私が考えていた:

CREATE TABLE eventSupplier(
id SERIAL PRIMARY KEY、
eventid INT NOT NULL、
hotelid INT、
supplierid INT、
CONSTRAINT UNIQUE(eventid、hotelid、supplierid)、-UNIQUEはNULLを許可し
ますCONSTRAINT CHECK(hotelid ISNOTNULLまたはsupplieridISNOT NULL)、
FOREIGN KEY(hotelid)REFERENCES hotel(id)、
FOREIGN KEY(supplierid)REFERENCESsupplier(id)
);

次に、このデータを取得するには、両方のテーブルへの外部結合を使用して、どちらがリンクされているかを判断します。

イベントIDとしてe.idを選択し、 eventSupplier
からの サプライヤーとしてcoalesce(h.name、s.name)を選択
し ます 。 .idがnullでない、またはs.idがnullではない



私の他のオプションは、eventSupplierテーブルに単一の外部キーと「タイプ」の別のフィールドを含めることでした。これはデータを取得するのが難しいソリューションのようですが、これを拡張せずにトラックを拡張したい場合は非常に柔軟に見えます。スキーマを変更する。または、hotelidをSupplierテーブルに直接保存し、一部のサプライヤーを「ホテル」として宣言することもできますが、不要な冗長データがあります。

これについての考えは大歓迎です!

乾杯フィル

4

2 に答える 2

1

イベントを 1 つずつ処理し、 を使用しEventGroupてそれらをグループ化するのはどうですか? 代替テキスト

編集

最新のコメントに合わせてエンティティの名前を変更しただけです。これは私がこれに近づくことができる限りです-確かに私は問題を正しく理解していません。

代替テキスト

于 2010-08-18T11:40:30.640 に答える
0

ソリューションをテストする良い方法は、航空会社がサプライヤーになったらどうなるかを考えることです。あなたのソリューションはそれを処理しますか、それとも複雑になり始めますか?

他のタイプのサプライヤーのそのレベルのデータが必要ないのに、なぜホテルのデータをサプライヤー ルートで明示的に検索する必要があるのでしょうか? これらの目的のために、ホテルであろうとなかろうと、サプライヤーはサプライヤーであることをお勧めします。

サプライヤーをホテルとしてフラグ付けする場合は、単純に hotelid をサプライヤー テーブルに置くか、他のサプライヤーの詳細を取得するために使用するメカニズムを介して、後でサプライヤーをフックします。

于 2010-09-06T14:43:15.737 に答える