Я работаю над магазинной системой (в PHP & MySQL), которая экспортирует счета-фактуры во внешнюю систему. Процессы идут примерно так:Являются ли избыточные данные всегда бездействующими
- Клиента заказывает товар и счет-фактура создается
- XML генерируется для этого счета-фактуры и отправляется на внешний сервер
- Внешний сервер обрабатывает XML и реагирующий с другим XML
- система обрабатывает ответ.
Для каждого XML, которые будут посылаться на внешний сервер записи создается в базе данных, содержащей соответствующий INVOICENUMBER и статус (статус изначально SENT
, что указывает на XML отсылается.) После того, как система обрабатывается ответ - статус SUCCESS
или ERROR
. Теперь проблема заключается в следующем: в какой-то момент я хочу получить список счетов-фактур, которые не имеют записи в таблице запросов со статусом SUCCESS
.
EDIT: Если статус 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 WHERE requestSuccess = 0
), однако это будет технически излишним.
Мой вопрос: что было бы лучше; используйте простой запрос за счет наличия избыточного поля или используйте более тяжелый запрос и не загрязняйте базу данных избыточностью. Конечно; если кто-либо из вас знает о лучшем решении, не используя избыточность, что было бы еще лучше.
это кажется очень субъективным для меня - лично я не считаю его излишним, если он приводит к быстрому запросу и медленному запросу - однако я не являюсь администратором баз данных, и я уверен, что много будет предлагать другую точку зрения – jammypeach
Я бы рассмотрел денормализацию данных, как вы предлагаете, если она избегает тяжелых запросов, хотя вы можете рассмотреть другие способы оптимизации. Есть ли несколько запросов на счет-фактуру (это не на 100% ясно из вашего вопроса)? – liquorvicar
@ liquorvicar; Я обновил свой вопрос; существует вероятность того, что на счет-фактуру более одного запроса. –