Лучший метод обновления для БД MySQL - PullRequest
0 голосов
/ 02 января 2009

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

Таким образом, пользователь загружает CSV-данные следующей недели. Вставляется в БД, без проблем.

НО

через час он получает отзывы от всех и должен соответственно обновлять. Он обновляет CSV и идет, чтобы загрузить его в БД.

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

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

Так!

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

Спасибо!

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

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

Данные данные являются рабочим графиком каждого. Поэтому было бы неплохо (для конкретных применений этого графика помимо простого вывода) для каждой смены иметь ключ. Но проблема в том, скажем, что user1 опоздал в понедельник. Опоздания записываются в отдельную таблицу и привязываются к смене с помощью клавиши 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?

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

Еще раз спасибо.

Ответы [ 2 ]

0 голосов
/ 02 января 2009

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

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

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

0 голосов
/ 02 января 2009

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

LOAD DATA LOCAL INFILE '/path/to/data.csv' REPLACE INTO TABLE table_name
...