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产生的,所以这是无关紧要的.
任何帮助将不胜感激!
这更像是@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字段的表中,随着预订的推进逐渐填充.