2013-01-06 34 views
0

我使用MySQL并且我的表使用innoDB存储以达到参照完整性目的。MySQL表中的问题:当两列中的一列必须为空(连续)

问题

我建立一个销售订单系统。 我invoice表有tracking_code列和COD_place

客户的交易与我使用上述两种方法之一:航运或COD(现金 交付/他见面了个人)。 每件出货的包裹都有一个跟踪代码,而对于COD,则必须有一个地方可以做到这一点。因此列tracking_codeCOD_place

问题是,如果装运是首选,那么COD_place列应为NULL或留空;否则,tracking_code必须为NULL。

这不是优雅。代表这一点的最佳方式是什么?你可以在MySQL中创建一个广义实体,method

我真的想不出任何优雅的解决方案,所以我转向你的帮助。 提前谢谢!

+0

一个选项是将细节存储在单独的表中。例如发票表可以有Enum(TRACKING,COD),reference_id。 '跟踪'表格将具有id,tracking_code。 'COD'表将具有id,cod_place。跟踪表和COD表都将通过reference_id与发票表相关。话虽如此,如果您要频繁查询Invoice表,也许您的原始设计会更好(尽管为空字段),因为它将避免在表拥有数百万条记录后可能变得繁重的联接。 –

+0

是的,谢谢你。我不喜欢太多的NULL。 但我不喜欢在该跟踪发票reference_id和COD可以有相同的ID(自动增量优先于alphanum)值,虽然我可以确定哪个表从Enum列加入。但是,这将使用PHP实际上我希望它是内部的。 所以我想我会坚持原来的设计。 Thaaanks! –

+0

你需要的是一个CHECK约束。不幸的是,这些在MySQL中不被支持。看到这里http://stackoverflow.com/questions/2115497/check-constraint-in-mysql-is-not-working和这里http://stackoverflow.com/questions/5807231/mysql-check-constraint-alternative的方法使用触发器。 –

回答

0

您应该引入一个附加列来指定请求哪种类型的事务。不要试图根据其他信息隐含地假设这一点。

表中有冗余信息的字段(使用NULL)是可以接受的。

或者,您可以为每种类型的交易添加一个附加表,只有该类型交易所需的相关字段。这具有额外的优势,能够清楚地表示这些过程而不受其他人的干扰。

例如,您可能有应该处理COD交易的业务逻辑,其中包括“司机收取的付款”状态,而您的运输交易可能有一列来处理“付款预授权的交易ID”。 COD逻辑不需要关心航运交易,反之亦然。

使用发票上的附加transaction_type字段,您可以知道要加入哪个表,以便收集附加信息。如果您将来添加第三种类型,那么您不会得到一个不断扩大的发票表。

+0

凭借发票上的附加字段,我知道要加入哪张表。然而,确定哪个表加入明确使用PHP正确?我的意思是,使用PHP来获取transaction_type的值,然后与相应的表加入? –

+0

是的,我会那么做@ Chin-yangLee。你可以在MySQL中合理地执行两个表的联合,但是这几乎破坏了将不同的字段拆分成不同表格的目的。您可以通过查看transaction_type字段(或任何您称之为的)来确定哪个是哪个。 –

相关问题