Database design 在匹配表中使用空值

Database design 在匹配表中使用空值,database-design,Database Design,我正在处理预订系统的会计部分(想想豪华轿车公司) 在系统中,有多个对象可以付款或提交付款。我在三个表中跟踪所有这些“事务”:tx、tx\u cc和tx\u ch tx生成一个新的tx_id(用于交易id)并保留有关金额、有效期等的信息。tx_cc和tx_ch分别保留有关使用的信用卡或支票的信息,这些信息链接到其他表(信用卡和银行账户等) 对我来说这似乎很正常,不是吗 现在我的问题是: 支付交易的发生有多种原因。要么是预订费用在支付,要么是预订的旅行社费用在支付,要么是司机费用在支付,等等 这将产

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

在系统中,有多个对象可以付款或提交付款。我在三个表中跟踪所有这些“事务”:tx、tx\u cc和tx\u ch

tx生成一个新的tx_id(用于交易id)并保留有关金额、有效期等的信息。tx_cc和tx_ch分别保留有关使用的信用卡或支票的信息,这些信息链接到其他表(信用卡和银行账户等)

对我来说这似乎很正常,不是吗

现在我的问题是:

支付交易的发生有多种原因。要么是预订费用在支付,要么是预订的旅行社费用在支付,要么是司机费用在支付,等等

这将产生多个表,每个表对应一个实体:代理发送、驱动发送、预订发送等

它们看起来像这样:

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\u id或reservation\u item\u id为null。在未来,可能会有其他事情是司机支付的,我也会添加到这个表中,默认为null

这有什么规定?意见

显然,我可以将其分解为许多三列表,但所需的外部连接量似乎太大了

谢谢你的意见

和平,
Tom

处理此问题的最佳方法可能是通过,但仅通过给定的数据库结构很难判断。
您可以为每个可以付款的实体建模一个超类型,为每个可以提交付款的实体建模另一个超类型

在这种情况下,表驱动程序_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;