4

私はプロジェクトで忙しく、私が遭遇したつまずきのブロックの 1 つは次のとおりです。

予約テーブルがありますが、請求書が発行される場合と発行されない場合があります (キャンセルなどの無関係なもののため)。1 (予約側) 対 0 または 1 (請求書側) の関係を強制するにはどうすればよいですか? ここに私がこれまで持っているものがあります:

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私がシステムで使用する他のものです。もPHPで生成されるinvoice_numberため、これは関係ありません。

どんな助けでも大歓迎です!

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。請求書を複数の予約に接続することはできません。これは、1 つのフィールド (1 行内) に複数の値を含めることができないためです。

そのため、予約と請求書の関係は「1 対 0 または 1」になります。


または、予約が進むにつれて徐々に入力される NULL 可能なフィールドを持つ 1 つのテーブルにすべてを配置します。

于 2013-04-15T02:16:08.257 に答える