Php 冗余数据总是不允许的吗
我正在开发一个类似商店的系统(在PHP和MySQL中),它将发票导出到外部系统。过程是这样的Php 冗余数据总是不允许的吗,php,mysql,database-design,Php,Mysql,Database Design,我正在开发一个类似商店的系统(在PHP和MySQL中),它将发票导出到外部系统。过程是这样的 客户订购产品并创建发票 为该发票生成XML并发送到外部服务器 外部服务器处理XML并用另一个XML响应 系统处理响应 对于发送到外部服务器的每个XML,将在数据库中创建一条记录,其中包含相应的发票号码和状态(状态最初为已发送,表示XML已发送)。系统处理响应后,状态为成功或错误。现在问题是,;在某个时候,我想获取一个在请求表中没有记录的发票列表,状态为SUCCESS 编辑:如果状态为ERROR,则将
- 客户订购产品并创建发票
- 为该发票生成XML并发送到外部服务器
- 外部服务器处理XML并用另一个XML响应
- 系统处理响应
已发送
,表示XML已发送)。系统处理响应后,状态为成功
或错误
。现在问题是,;在某个时候,我想获取一个在请求表中没有记录的发票列表,状态为SUCCESS
编辑:如果状态为ERROR
,则将有一个新的请求,请求相同的发票,因此每个发票可能有多个请求
我的订单表有列ID
和InvoiceNumber
,请求表有列ID
、InvoiceNumber
和Status
,因此要获得所提到的列表,我可以执行以下操作:
SELECT InvoiceNumber
FROM orders AS a
LEFT JOIN requests AS b
ON a.InvoiceNumber = b.InvoiceNumber
WHERE NOT EXISTS (SELECT ID
FROM requests
WHERE status = "SUCCESS"
AND request.InvoiceNumber = a.InvoiceNumber)
但是,第二个选项是为订单表(即,requestSucces
)创建一个额外的列,该列最初为0,如果系统处理相应发票的成功响应,则设置为1。这将导致一个更简单、成本更低的查询,以获取需要(重新)发送的发票列表(SELECT invoiceNumber FROM orders,其中requestSuccess=0
),但是该字段在技术上是多余的
我的问题是:什么会更好;以冗余字段为代价使用简单的查询,或者使用较重的查询,并且不会用冗余污染数据库。当然如果你们中有人知道一个更好的解决方案,而不使用冗余,那就更好了。战争已经围绕标准化展开:-) 但是:
由于您正在查找未设置为
success
的发票,您不能这样做吗
SELECT InvoiceNumber
FROM requests
WHERE status != "SUCCESS"
(注意不相等的符号)当您将状态字段numeric error=0和success=1设置为一个时,您可以按invoicenumber进行最大状态分组,以查看哪些发票为“否”,因为从您提供的信息来看,似乎每个发票的请求表中都至少有一个条目,您可以从如下查询中获得所需的数据:
SELECT InvoiceNumber
FROM Requests AS r_error
LEFT JOIN Requests AS r_success
ON (r_error.InvoiceNumber=r_success.InvoiceNumber AND r_error.status!='SUCCESS'
AND r_success.status='SUCCESS')
WHERE r_success.InvoiceNumber IS NULL
我不确定它是否会闪电般地快,但我认为它会比您最初的查询更快(我还没有测试过这个理论!)但更重要的是,它不使用你的订单表,所以也不应该影响你的事务处理。这对我来说似乎是很主观的——我个人认为如果它导致快速查询而不是缓慢查询,那么它是多余的。如果你可以考虑其他的优化方法,如果它避免了一个繁重的查询,那么就按照你的建议去定义数据。每个发票是否有多个请求(您的问题不是100%清楚)?@Liqorvicar;我更新了我的问题;每个发票可能有多个请求。您好,补丁,谢谢您的回复,但由于每个发票可能有多个请求,很遗憾,这不起作用。不过,我想到了这个选项;还有更多的状态(
SENT
是我在问题中提到的状态,但还有其他状态)。你认为给他们一个数字,让SUCCESS
最高是一种选择吗?我认为这取决于州的数量以及你如何组合它们。如果你只有发送,成功和错误,我想你可以走这条路。如果您将来要添加更多状态,您必须做好准备,确保最大值不会与新状态发生冲突。我想我会使用类似的方法。或者将成功设置为0并按最小值分组(状态)。这取决于您是否能够处理由零表示的成功!受这个答案的启发,我将使用每个状态的数字表示。