0

我对触发器和 PL/SQL 相当陌生,所以我的问题主要是设计问题之一。

我正在创建一组表来表示购票。门票分为三种:

  • 票#1:价格、数量、时间
  • 票#2:价格、数量、时间、座位、可退款
  • 票#3:价格、数量、时间、食物、饮料

所以我创建了三个表:(我相信这被称为规范化):
Table1有列价格、数量和时间
Table2有座位和可退款
Table3有食物和饮料

我在 Table1 中插入了一个主键列,并在 Table2 和 Table3 中使用了指向 Table1 PK 的外键。

计划:当用户购买机票时,我将一条记录插入到相应的表中。例如,如果用户购买:
Ticket #1,我在 Table1 中插入一条记录
Ticket #2,我在 Table1 和 Table2 中插入一条记录
Ticket #3,我在 Table1 和 Table3 中插入​​一条记录

问题:如何接收非类型 1 票证的所有数据,然后拆分参数以插入单独的表中。例如,当我尝试为 Table2 创建触发器时,该触发器只能接收与 Table2 列匹配的参数。如何接收 Table1 的数据?

完整购买票类型 2 的示例。
用户在线购买票 -> 网络表单内容发生... -> dao 向数据库发送一个插入命令 -> 表 2 的触发器启动并验证表 1 和表 2 的信息。

谢谢!

4

1 回答 1

0

您可以以任何您想要的方式设计它,但鉴于票证类型之间没有太大区别,我将有一个表:

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 回答