2

レストラン チェーンのデータベースを設計する必要があります。
状況は次のとおりです。顧客は、アイテム C を購入すると、アイテム A が無料になるか、アイテム B が無料になるか (両方ではない) を取得します。

以下は、私の DB の 2 つのテーブルです。
ここに画像の説明を入力


上記の例では、新しい HappyHourMenuTransId を生成する HappyHour_Menu_Trans に項目 C のエントリを挿入します。この HappyHourMenuTransId を使用して、HappyHour_Menu_Subsequent テーブルに 2 つのエントリを挿入します。

ではオプションパーツはどうでしょうか。
両方のエントリに値「OR」を入れる列「条件」を追加することを考えることができます。この OR は、1 つのオプションしか選択できないことを示しています。
値を 'AND' にすると、両方の商品に割引が適用されることがわかります。

今のところはこの解決策で問題ありませんが、先輩は文字列の使用を避けるように求めています。チェックボックスを使用できます (それは問題ではありません!)。

トリッキーな部分はここから始まります -

割引がこのようなものであるとしましょう - アイテム A を購入すると、両方 (アイテム B + アイテム C) が無料になるか、または (アイテム D + アイテム E) だけが無料になります。

現在のシステムに従って、4 つのエントリを挿入します。しかし、テーブルから正確なロジックを知るにはどうすればよいでしょうか (どの 2 つの項目がペアになるのでしょうか?)。

4

2 に答える 2

0

あなたが行った次の声明について明確にする必要があります。

「アイテム A を購入すると、両方 (アイテム B + アイテム C) が無料になるか、または (アイテム D + アイテム E) だけが無料になります。」

アイテムDまたはアイテムEのみですか?

最初は、これはある種の参照整合性で解決できると考えていました。

割引テーブルには次のエントリがあります。

(Purchase Item, Free Item)
(A, B)
(A, C)

[HappyHour_Menu_Subsequent] テーブルとこれら 2 つの列の間に外部キー関係を作成します。ただし、これは 1 対 1 の関係を前提としています。アイテムのバンドル、1 対 1 または 1 対 x を開始すると、このソリューションは失敗します。

ビジネス ロジックが変更される可能性があるという事実を考えると、2 つの解決策が思い浮かびます。

1 - アプリケーションがテーブルへの直接の挿入と更新を行う場合、INSERT または UPDATE トリガーを使用してビジネス ロジックを適用します。

CREATE TRIGGER [TRG_ENFORCE_MY_HAPPY_HOUR_DEALS] 
    ON [HappyHour_Menu_Subsequent]
FOR INSERT, UPDATE
AS
BEGIN

-- put your logic here
IF (Violation) 
    RAISERROR();

END

違反は単なるプレースホルダーです。購入したアイテムと無料のアイテムを取得するには、挿入されたテーブルと削除されたテーブルを確認する必要があります。組み合わせがビジネス ルールを満たしていることを確認してください。

ロジックに違反している場合は、フロント エンドでエラーを処理します。

2 - ストアド プロシージャを使用して INSERTS または UPDATES を実行する場合は、そのコードにビジネス ロジックを追加します。

于 2013-09-24T12:21:09.163 に答える