2013-04-14 70 views
4

我忙於一個項目,我遇到的絆腳石之一是:如何以編程方式創建一對一或一對一的關係 - MySQL?

我有一個預訂表,它可能會導致或不會導致發票(因爲某些無關的東西,如取消)。我如何執行一個(在預訂方面)到零或一個(在發票方面)關係?下面是我迄今:

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中生成的,所以這是無關緊要的。

任何幫助將不勝感激!

+0

我應該補充說我討厭任何可爲空的值。所以任何避免NULL的東西都會很棒! – iLikeBreakfast

+0

我沒有看到您當前的設計有任何問題。 –

+0

只是好奇,爲什麼'invoice_number'沒有PK和'booking_id','voucher_id'是一個UNIQUE?似乎有點不合邏輯,你的外鍵可能指向invoice_number? – thaJeztah

回答

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... 
); 

最小基數:可以有預訂無發票。但是,如果沒有預訂,則不能有發票(由於非空字段invoice.booking_id上的FK)。

最大基數:由於invoice.booking_id上的UNIQUE約束,預約無法連接到多個發票。發票無法連接到多個預訂,只是因爲一個字段(在一行中)不能包含多個值。

因此,預訂和發票之間產生的關係是「一到零或一個」。


或者,將所有內容放在只有一個表格中,並且可以隨着預訂的進展逐漸填充NULL字段。

+1

感謝您提出建議;寫得很好的答案! – thaJeztah

+0

是否通常有使用兩個表的原因,而不是具有可空字段的表,還是僅僅是個人偏好? – kcstricks

+1

@kcstricks在這個特殊的情況下,沒有。但是,如果這是較大數據庫模型的一部分,則可能需要保留獨立表,以便您可以更輕鬆地將它們連接到模型其餘部分的表中。可能還有一些物理考慮因素 - 這[回答](http://stackoverflow.com/a/9688442/533120)列舉了一些真正的1:1關係的擔憂,但其中一些可能適用於1: 0..1以及... –