2010-06-23 61 views
0

我正在研究預訂系統的會計部分(想想豪華轎車公司)。在匹配表中使用NULL NULL

在系統中有多個對象可以付款或提交付款。我在三個表中追蹤所有這些「交易」,這三個表稱爲:tx,tx_cc和tx_ch。

tx生成一個新的tx_id(用於事務ID)並保存有關金額,有效性等信息。Tx_cc和tx_ch分別保存關於使用信用卡或支票的信息,鏈接到其他表(credit_card和bank_account等等)。

這對我來說似乎相當規範,不是嗎?

現在,這裏是我的問題:

支付交易可能發生的原因有無數。無論是預訂付款,預訂預訂的旅行社正在付款,司機正在付款等。

這導致多個表,每個實體一個:agent_tx,driver_tx,reservation_tx,等

他們看起來像這樣:

CREATE TABLE IF NOT EXISTS `driver_tx` (
    `tx_id` int(10) unsigned zerofill NOT NULL, 
    `driver_id` int(11) NOT NULL, 
    `reservation_id` int(11) default NULL, 
    `reservation_item_id` int(11) default NULL, 
    PRIMARY KEY (`tx_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

現在,這個交易是一個驅動程序,但可以適用於單個項目上保留或整個整個預訂。因此,我要求reservation_id或reservation_item_id爲null。將來可能會有其他的事情要付給司機,我也會在這張表中添加,默認爲空。

這是什麼規則?意見?

很明顯,我可以把它分解成很多三列表,但是所需的OUTER JOINing的數量看起來很離譜。

您的輸入將被讚賞。

和平, 湯姆

回答

1

也許來處理這一點的最好辦法是通過generalization,但難以僅通過指定的數據庫結構告訴。
您可以爲可付款的每個實體建模一個超類型,併爲可以提交付款的每個實體建立另一個超類型。

在這種情況下,你的表driver_tx將被推廣到:

CREATE TABLE IF NOT EXISTS `tx` (
    `tx_id` int(10) unsigned zerofill NOT NULL, 
    `paying_id` int(11) NOT NULL, 
    `payable_id` int(11) NOT NULL, 
    PRIMARY KEY (`tx_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 
相關問題