如何以编程方式创建一对一或一对关系 - MySQL?

iLi*_*ast 4 mysql sql database-design foreign-keys relational-database

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

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

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 ; 
Run Code Online (Sandbox Code Playgroud)

然后,后来:

  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 ; 
Run Code Online (Sandbox Code Playgroud)

voucher_id只是我在系统中使用的其他东西.该invoice_number还的PHP产生的,所以这是无关紧要的.

任何帮助将不胜感激!

Bra*_*vic 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...
);
Run Code Online (Sandbox Code Playgroud)

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

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

因此,预订和发票之间产生的关系是"一到零或一".


或者,将所有内容放在一个具有NULL字段的表中,随着预订的推进逐渐填充.