Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 冗余数据总是不允许的吗_Php_Mysql_Database Design - Fatal编程技术网

Php 冗余数据总是不允许的吗

Php 冗余数据总是不允许的吗,php,mysql,database-design,Php,Mysql,Database Design,我正在开发一个类似商店的系统(在PHP和MySQL中),它将发票导出到外部系统。过程是这样的 客户订购产品并创建发票 为该发票生成XML并发送到外部服务器 外部服务器处理XML并用另一个XML响应 系统处理响应 对于发送到外部服务器的每个XML,将在数据库中创建一条记录,其中包含相应的发票号码和状态(状态最初为已发送,表示XML已发送)。系统处理响应后,状态为成功或错误。现在问题是,;在某个时候,我想获取一个在请求表中没有记录的发票列表,状态为SUCCESS 编辑:如果状态为ERROR,则将

我正在开发一个类似商店的系统(在PHP和MySQL中),它将发票导出到外部系统。过程是这样的

  • 客户订购产品并创建发票
  • 为该发票生成XML并发送到外部服务器
  • 外部服务器处理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并按最小值分组(状态)。这取决于您是否能够处理由零表示的成功!受这个答案的启发,我将使用每个状态的数字表示。