4

我正忙于一个项目,我遇到的绊脚石之一如下:

我有一个预订表,它可能会或可能不会导致开具发票(因为一些不相关的东西,例如取消)。我将如何强制执行一(在预订方面)到零或一(在发票方面)的关系?到目前为止,这是我所拥有的:

CREATE TABLE IF NOT EXISTS `booking` (    
   `booking_id` int(11) NOT NULL AUTO_INCREMENT,   
   `voucher_id` int(11) NOT NULL,  
   `pickup_date_time` datetime NOT NULL, ...  
   PRIMARY KEY (`booking_id`,`voucher_id`)  
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

然后,稍后:

  CREATE TABLE IF NOT EXISTS `invoice` (  
  `booking_id` int(11) NOT NULL,  
  `voucher_id` int(11) NOT NULL,  
  `invoice_number` int(11) NOT NULL,  
  `paid` tinyint(1) NOT NULL,  
  PRIMARY KEY (`booking_id`,`voucher_id`),  
  UNIQUE KEY `invoice_number` (`invoice_number`),  
  KEY `voucher_id` (`voucher_id`)  
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

voucher_id只是我在系统中使用的其他东西。invoice_number也是在PHP中生成的,所以这无关紧要。

任何帮助将不胜感激!

4

1 回答 1

5

这更像是对@thaJeztah 在他的评论中已经提出的建议的系统化,但无论如何你都在这里......

CREATE TABLE voucher (
    voucher_id int(11) PRIMARY KEY
   -- Etc...
);

CREATE TABLE booking (
    booking_id int(11) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    voucher_id int(11) REFERENCES voucher (voucher_id),
    pickup_date_time datetime NOT NULL
   -- Etc...
);

CREATE TABLE invoice (
    invoice_number int(11) NOT NULL PRIMARY KEY,
    booking_id int(11) NOT NULL UNIQUE REFERENCES booking (booking_id),
    paid tinyint(1) NOT NULL
   -- Etc...
);

最小基数:可以有没有发票的预订。但是,没有预订就不可能有发票(由于非 NULL 字段上的 FK invoice.booking_id)。

最大基数:由于 UNIQUE 约束,一个预订不能连接到多个发票invoice.booking_id。一张发票不能连接到多个预订,因为一个字段(一行)不能包含多个值。

因此,预订和发票之间的最终关系是“一对零或一”。


或者,将所有内容放在一个表中,该表具有可空字段,随着预订的进行逐渐填充。

于 2013-04-15T02:16:08.257 回答