здравствуйте
возникла задача для ресурса, пользователи просят сделать такую функцию - выгрузка товаров из xml
планируется алгоритм:
пользователь загружает файл
модератор проверяет
пользователь жмет внести - данные заносятся в бд
повторно загружает файл - тоже, толдько сравнить файлы (переведём в пхп массивы) (планируется сравнивать хеш от данных в элементе) и внести изменения (удалить, обновить, добавить)
подскажите пожалуйста варианты (правильный) алгоритм работы?
как лучше сравнивать файлы?
как это организовать автоматически с минимумом затрат?
1. broshurkaplus - 21 Декабря, 2016 - 10:59:24 - перейти к сообщению
2. Мелкий - 21 Декабря, 2016 - 11:47:10 - перейти к сообщению
Нафиг вообще загружать файл повторно?
Правильный алгоритм зависит от вашей бизнес-логики. В частности, модерация в целом - это только требование бизнеса. Требование реализации - валидация, что XML имеет какую-то осмысленную структуру и вы эту структуру можете помержить с базой. Всё, если валидно - значит можно писать, нет - ответ пользователю с пояснением, что в документе сделано неверно.
Для регулярных обязательны ещё хотя бы одно из двух сценариев:
слушающий скрипт, которому можно присылать новый xml (ака push политика обновления)
фоновый скрипт, загружающий по указанному пользователем урлу новый xml с какой-то регулярность (pull соответственно)
Правильный алгоритм зависит от вашей бизнес-логики. В частности, модерация в целом - это только требование бизнеса. Требование реализации - валидация, что XML имеет какую-то осмысленную структуру и вы эту структуру можете помержить с базой. Всё, если валидно - значит можно писать, нет - ответ пользователю с пояснением, что в документе сделано неверно.
Для регулярных обязательны ещё хотя бы одно из двух сценариев:
слушающий скрипт, которому можно присылать новый xml (ака push политика обновления)
фоновый скрипт, загружающий по указанному пользователем урлу новый xml с какой-то регулярность (pull соответственно)
3. broshurkaplus - 21 Декабря, 2016 - 12:36:20 - перейти к сообщению
ммда
на данном этапе только ручно планирую, (бесплатно например раз в неделю 1 файл на 1000 элементов, для каждой конечной категории или 3 файла) пользователь загрузит файл, он валидируется
вот тук как мне
сразу писать - нагрузка на бд в основной таблице, поэтому думаю что
первый раз - может как-то сложить в таблицу в очередь все запросы на добавление, а потом уже вставлять в основную таблицу по частям кроном например
при повторной загрузке сравнивать и в очередь только новые, удалённые или измененные
вопрос как сравнивать?
читать лучше в цикле simplexml_load_file целиком или лучше XMLReader по частям очищая память на каждой итерации?
если не сложно напишите чуть подробней алгоритм который видится Вам
спасибо
на данном этапе только ручно планирую, (бесплатно например раз в неделю 1 файл на 1000 элементов, для каждой конечной категории или 3 файла) пользователь загрузит файл, он валидируется
вот тук как мне
сразу писать - нагрузка на бд в основной таблице, поэтому думаю что
первый раз - может как-то сложить в таблицу в очередь все запросы на добавление, а потом уже вставлять в основную таблицу по частям кроном например
при повторной загрузке сравнивать и в очередь только новые, удалённые или измененные
вопрос как сравнивать?
читать лучше в цикле simplexml_load_file целиком или лучше XMLReader по частям очищая память на каждой итерации?
если не сложно напишите чуть подробней алгоритм который видится Вам
спасибо
4. Мелкий - 21 Декабря, 2016 - 13:51:28 - перейти к сообщению
Алгоритм мне не видится пока не понятны требования.
Просто помержить несколько десятков тысяч строк - фигня какая. Лишь бы только всякое orm не мешалось.
Просто помержить несколько десятков тысяч строк - фигня какая. Лишь бы только всякое orm не мешалось.
CODE (SQL):
скопировать код в буфер обмена
скопировать код в буфер обмена
- CREATE TEMPORARY TABLE tmptable
- -- слить данные из файлика в эту временную табличку
- CREATE UNIQUE INDEX ON tmptable USING(ext_id)
- begin
- UPDATE realtable JOIN tmptable USING(ext_id) ...
- DELETE FROM realtable WHERE NOT EXISTS (SELECT 1 FROM tmptable WHERE realtable.ext_id = tmptable.ext_id)
- INSERT INTO realtable (...) SELECT ... FROM tmptable WHERE NOT EXISTS (SELECT 1 FROM realtable WHERE realtable.ext_id = tmptable.ext_id)
- commit
- DROP TEMPORARY TABLE tmptable
Для нужд модерации можно использовать не временную, а постоянную табличку. Добавить ещё file_id со ссылкой на табличку загружаемых файликов. Партицировать этак по месяцам, чтобы было попроще ненужные более разделы удалять.
Модератору станет удобнее показывать данные уже из персистентной таблички.
Какие-нибудь категории позволять передавать в формате источника - мелкие списки вычитайте в словарь, внешний_id => свой.
Большие списки - писать во временную табличку данные как есть. И рядом поле default null для ваших id. Затем апдейтом помержить со словарём и пройтись по локальный_id is null чтобы узнать, не надо ли пользователю сказать "у вас значения поля непонятное" и прерваться. Или не мержить такие, смотря что вам говорит задача. Мне нужна была строгая валидация.
Чем читать файлик - какая разница. Скройте эту информацию за фасадом из, например, yield. Не будет устраивать - замените.