Я использую PHP для решения этой задачи. Но дело не в этом.
Каждое утро я получаю четыре файла, каждый из которых содержит около 6000-8000 записей, имеющих следующую форму:
Разбирая эти записи, я получаю таблицу продуктов. Позже клиенты делают заказы, поэтому мне нужно сохранить идентификатор товара в таблице заказов. (клиенты хотели бы видеть историю покупок)
Все хорошо. Возникающая проблема заключается в том, что в один прекрасный день любой из поставщиков может отправить совершенно другой прайс-лист. То есть некоторые продукты будут удалены, а другие будут добавлены. Поэтому было бы совершенно неправильно полагаться на заказ в прайс-листе.
Я пришел к тому, что разбираю каталог вслепую, добавляя все элементы один раз. Каждый раз, когда я получаю каталог, мне нужно добавлять только новые элементы и удалять старый из БД. (хотя на самом деле не удаляется, а просто помечается как удаленный, чтобы новые покупки были невозможны)
Чтобы решить, является ли товар новым или нет, я извлеку запись по записи из файла Excel и проверим поля «Название продукта», «пакет», «производитель», «серия» в сочетании с таблицей с продуктами.
Если такой элемент не найден, я предполагаю, что это новый элемент, и добавлю его в БД.
Что делать с удаленными элементами? Я не предупрежден об их удалении. Поэтому я не могу узнать, какие элементы отсутствуют в новом файле Excel. Решение состоит в том, чтобы сканировать БД по элементам и видеть, присутствуют ли все элементы в БД в файле Excel. Если какой-то элемент отсутствует, я отмечу его как удаленный.
После того, как удаленные предметы могут быть возвращены для продажи. Поэтому мне нужно будет выбрать все удаленные элементы и проверить по одному на файл Excel. Если элемент появляется в файле Excel — я добавляю его обратно.
Стоит отметить, что некоторые поставщики на данный момент предоставляют свои каталоги в виде файлов Excel, а другие — в виде файлов DBF. Кто знает, какие форматы появятся в будущем. Также должно увеличиться количество поставщиков (в следующем месяце в игру вступят еще 2).
Мой вопрос. Есть ли лучший способ сделать это более эффективным? Я боюсь, что мой метод слишком прост.
Имея 8000 записей и выполнив 3 проверки, я получу O ^ 2 сложности для каждого прайс-листа, делая полный поиск через MySQL Db. Возможно, он будет работать для 8000 записей, но я уверен, что он потерпит неудачу, когда однажды я получу прайс-лист с, скажем, 10 ^ 5 записями.
Есть ли лучший способ организовать это?
Благодарю.
Задача ещё не решена.
Других решений пока нет …