Вопрос

Я ознакомился с решениями подобных проблем, но все они, похоже, связаны со скриптами и дополнительными инструментами.Я надеюсь, что моя проблема достаточно проста, чтобы избежать этого.

Итак, пользователь загружает CSV-файл с данными за следующую неделю.Он будет вставлен в базу данных, без проблем.

НО

через час он получает отзывы от всех и должен соответствующим образом вносить обновления.Он обновляет CSV-файл и отправляется загружать его в базу данных.

Прямо сейчас система, которую я использую, проверяет, есть ли уже данные за эту неделю, и если это так, извлекает все эти данные из базы данных, скрипт находит различия и отправляет их, и после всего этого данные старые данные удаляются и заменяются новыми данными.

Очевидно, что намного проще просто стереть его и повторно ввести данные, но это не лучший метод, особенно если есть много изменений или тонны данных.Но я должен знать, КАКИЕ изменения были внесены для отправки оповещений.Но мне не нужен журнал транзакций, так как оповещения нужно отправлять только один раз, и после этого старые данные бесполезны.

Итак!

Есть ли разумный способ сравнить новые данные с уже существующими данными, получить только те строки, которые были изменены / удалены / добавлены, и внести эти изменения?Прямо сейчас кажется, что я мог бы сделать обновление, но тогда я не получу никакого ответа о том, что изменилось...

Спасибо!

Быстрое редактирование:

В настоящее время внешние ключи не используются.Это скоро изменится, но это не должно иметь значения, потому что внешние ключи будут указывать только на то, на кого влияют данные, и, следовательно, их не нужно будет менять.Что касается первичных ключей, то это действительно представляет некоторую дилемму:

Данные, о которых идет речь, - это график работы каждого человека.Так что было бы неплохо (для конкретных приложений этого графика, выходящего за рамки простого вывода), чтобы у каждой смены был ключ.Но проблема в том, что, допустим, пользователь1 опоздал в понедельник.Опоздание заносится в отдельную таблицу и привязывается к смене с помощью клавиши shift.Но если во вторник возникнет необходимость внести некоторые изменения в уже текущую неделю, я боюсь, что станет слишком сложно гарантировать, что все записи в базе данных, которые уже произошли (и, следовательно, могут иметь ассоциации, которые не должны быть нарушены), будут переопределены в процессе.К сожалению, это не так просто, как обновлять только все события, происходящие ПОСЛЕ текущего времени, поскольку это добавило бы работы (и, следовательно, сделало бы ее менее востребованной) для людей, которые выполняют загрузку.По сути, они создают расписание в одной программе, экспортируют его в формат CSV, а затем загружают на веб-страницу для всех веб-приложений, которым нужны эти данные.Таким образом, им просто намного проще (и менее напряженно для всех участников) выполнять одну и ту же процедуру каждый раз, экспортируя всю неделю и загружая ее.

Поэтому моя самая большая забота - сделать скрипт загрузки как можно более умным с обеих сторон.Он не раздувается, пытаясь найти изменения, он может найти изменения независимо от входных данных, И ни одна из данных, которые остаются неизменными, не рискует получить повторный ввод ключа.

Вот связанный с этим вопрос:

Suppose Joe User was schedule to wash dishes from 7:00 PM to 8:00 PM, but the new
data has him working 6:45 PM to 8:30 PM.  Has the shift been changed? Or has the old
one been deleted and a new one added?

И еще один:

Say Jane was schedule to work 1:00 PM to 3:00 PM, but now everyone has a mandatory
staff meeting at 2:00 to 3:00. Has she lost one shift and gained two? Or has one
shift changed and she gained one?

Мне действительно интересно узнать, как обычно обрабатываются такого рода данные, больше, чем конкретные ответы на вышесказанное.

Еще раз благодарю вас.

Это было полезно?

Решение

Прямо сейчас система, которую я использую, проверяет, есть ли уже данные за эту неделю, и если это так, извлекает все эти данные из базы данных, скрипт находит различия и отправляет их, и после всего этого данные старые данные удаляются и заменяются новыми данными.

Значит, ваш сценарий знает различия, не так ли?И вы же не хотите использовать какие-то дополнительные инструменты, помимо вашего скрипта и MySQL, верно?

Я совершенно убежден, что MySQL сам по себе не предлагает никаких инструментов 'diff', поэтому лучшее, чего вы можете добиться, - это создать новый CSV-файл только для обновлений.Я имею в виду - он должен содержать только измененные строки.Обновление было бы более быстрым, и все измененные данные были бы легко доступны.

Другие советы

Если у вас есть уникальный ключ в одном из полей, вы можете использовать:

LOAD DATA LOCAL INFILE '/path/to/data.csv' REPLACE INTO TABLE table_name
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top