0

私はトリガーと PL/SQL にかなり慣れていないので、私の質問は主に設計に関するものです。

チケット購入を表す一連のテーブルを作成しています。チケットには次の 3 種類があります。

  • チケット #1 : 価格、数量、時間
  • チケット #2 : 価格、数量、時間、座席、払い戻し可能
  • チケット #3 : 価格、数量、時間、食べ物、飲み物

だから私は3つのテーブル
作成ました :

Table1 に主キー列を挿入し、Table1 の PK を指す Table2 と Table3 で外部キーを使用しています。

計画: ユーザーがチケットを購入すると、適切なテーブルにレコードを挿入します。たとえば、ユーザーがチケット #1 を購入した場合、
テーブル 1 にレコードを挿入します チケット
#2、テーブル 1 とテーブル 2 にレコードを挿入します
チケット #3、テーブル 1 とテーブル 3 にレコードを挿入し ます

問題: タイプ 1 ではないチケットのすべてのデータを受け取り、パラメータを分割して別のテーブルに挿入するにはどうすればよいですか。たとえば、Table2 のトリガーを作成しようとすると、そのトリガーは Table2 の列に含まれるものと一致するパラメーターのみを受け取ることができます。Table1 のデータを受け取るにはどうすればよいですか?

チケット タイプ 2 の完全な購入の例。
ユーザーがチケットをオンラインで購入 -> Web フォームでの出来事... -> dao が 1 つの挿入コマンドをデータベースに送信 -> Table2 のトリガーが開始され、Table1 と Table2 の情報が検証されます。

ありがとう!

4

1 に答える 1

0

これは好きなように設計できますが、チケットの種類に大きな違いがないことを考えると、1 つのテーブルを使用します。

CREATE TABLE TICKET
 (ID_TICKET        NUMBER
    CONSTRAINT PK_TICKET
      PRIMARY KEY
      USING INDEX,
  TICKET_TYPE      NUMBER
    NOT NULL
    CONSTRAINT TICKET_CK1
      CHECK(TICKET_TYPE IN (1, 2, 3)),
  PRICE            NUMBER
    NOT NULL,
  QUANTITY         NUMBER
    NOT NULL,
  DEPARTURE_TIME   DATE
    NOT NULL,
  SEATING          NUMBER
    CONSTRAINT TICKET_CK2
      CHECK(1 = CASE TICKET_TYPE
                  WHEN 1 THEN CASE
                                WHEN SEATING IS NULL
                                  THEN 1
                                  ELSE 0
                              END
                  WHEN 2 THEN CASE
                                WHEN SEATING IS NULL
                                  THEN 0
                                  ELSE 1
                              END
                  WHEN 3 THEN CASE
                                WHEN SEATING IS NULL
                                  THEN 1
                                  ELSE 0
                              END
                END),
  REFUNDABLE_INDC  CHAR(1)
    NOT NULL
    CONSTRAINT TICKET_CK3
      CHECK(REFUNDABLE_INDC = CASE TICKET_TYPE
                                WHEN 1 THEN 'N'
                                WHEN 2 THEN 'Y'
                                WHEN 3 THEN 'N'
                              END),
  FOOD             CHAR(1)
    NOT NULL
    CONSTRAINT TICKET_CK4
      CHECK(FOOD = CASE TICKET_TYPE
                     WHEN 1 THEN 'N'
                     WHEN 2 THEN 'N'
                     WHEN 3 THEN 'Y'
                   END),
  DRINK            CHAR(1)
    NOT NULL
    CONSTRAINT TICKET_CK5
      CHECK(DRINK = CASE TICKET_TYPE
                      WHEN 1 THEN 'N'
                      WHEN 2 THEN 'N'
                      WHEN 3 THEN 'Y'
                    END));

ここでは、CHECK 制約を使用して、チケットの種類に基づいて適切なフィールドのみが入力されるようにします。

幸運を祈ります。

于 2016-02-07T01:47:52.497 に答える