在matchup表中使用NULL

时间:2010-06-23 22:59:32

标签: database-design

我正在研究预订系统的会计部分(想想豪华轿车公司)。

在系统中有多个对象可以付款或提交付款。我在三个表中跟踪所有这些“事务”: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的数量似乎太过分了。

感谢您的意见。

和平 汤姆

1 个答案:

答案 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;