Модераторы: skyboy, MoLeX, Aliance, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Алгоритм синхронизации данных формы с таблицей 
:(
    Опции темы
maxipub
Дата 3.3.2016, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: нет
Всего: 1



Добрый день!

Есть таблица с первичным ключом (ключ на самом деле составной: user_id, some_key) и неким набором данных (десяток int полей). Скрипт получает произвольное количество наборов в виде: some_key => some_data (по сути каждый такой набор - это одна строка в таблице). Эти входные данные могут как на 100% соответствовать данным в таблице, так и иметь некоторые различия:

- могут появиться новые строки;
- могут пропасть существующие;
- для существующих ключей могут поменяться данные.

По какому алгоритму лучше актуализировать таблицу, чтобы в ней сохранилось ровно то, что мы получили на входе?

У меня два приоритетных варианта.

1. Добавляем в таблицу поле `updating` TINYINT NOT NULL DEFAULT '0', при получении скриптом запроса на актуализацию данных, устанавливаем для записей нашего user_id поле updating=1, затем делаем INSERT ODKU с установкой updating=0 в обоих случаях, и в финале удаляем все, где updating=1 для нашего user_id.

2. Тупо удаляем все, и сразу же заносим все полученные данные в таблицу, т.е. DELETE всех записей пользователя, и затем INSERT всех данных.

Как лучше быть? Может быть, есть более цивилизованный вариант? Как бы поступили вы?

В таблице 1млн строк. Около 90% всех запросов скрипту приходят без изменения данных, каждый из них содержит 10-20 наборов данных (строк в таблице). smile  smile  smile 
PM MAIL   Вверх
ksnk
Дата 3.3.2016, 18:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прохожий
****


Профиль
Группа: Комодератор
Сообщений: 6855
Регистрация: 13.4.2007
Где: СПб

Репутация: 14
Всего: 386



Тоесть, приходит запись, на объект (objectID) со свойствами, каждое свойство занимает одну строку таблицы? Таблица, грубо говоря, состоит из строк [objectID, propertyID, Value].

objectID + propertyID - составной уникальный ключ. 

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

Код

delete from Table where objectID=1024 and propertyID in (4,56,789)

Для каждого свойства мастерим запрос insert-update
Код

insert into Table (`objectID`, `propertyID`, `Value`)
    values (?,?,?) on duplicate key update 
    `objectID`=VALUES(`objectID`), `propertyID`=VALUES(`propertyID`), `Value`=VALUES(`Value`) ;

Итого - нужно прочитать список старых свойств и выполнить пачку запросов. 

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


--------------------
Человеку свойственно ошибаться, программисту свойственно ошибаться профессионально ! user posted image
PM MAIL WWW Skype   Вверх
maxipub
Дата 4.3.2016, 11:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: нет
Всего: 1



ksnk, спасибо за вариант. Честно говоря, надеялся что есть все же какое-то системное, а не алгоритмическое решение. Буду думать. Тоже вариант, но мне мой первый ближе по пониманию происходящего. smile
PM MAIL   Вверх
DavidBelov
Дата 4.3.2016, 20:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 4.3.2016

Репутация: нет
Всего: нет



Так если ближе, чего его и не использовать?
PM MAIL WWW   Вверх
maxipub
Дата 7.3.2016, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: нет
Всего: 1



DavidBelov
Цитата(maxipub @  4.3.2016,  11:59 Найти цитируемый пост)
Честно говоря, надеялся что есть все же какое-то системное, а не алгоритмическое решение.


PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Базы Данных | Следующая тема »


 




[ Время генерации скрипта: 0.1159 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.