我正在研究预订系统的会计部分(想想豪华轿车公司)。
在系统中有多个对象可以付款或提交付款。我在三个表中跟踪所有这些“事务”: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。在将来可能会有其他东西支付驱动程序,我也会添加到此表,默认为null。
对此有什么规定?看来?
显然我可以将其分解为多个三列表,但是所需的OUTER JOIN的数量似乎太过分了。
感谢您的意见。
和平 汤姆
答案 0 :(得分: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;