среда, 19 февраля 2014 г.

Горизантальная перестановка записей в MySQL / SQL в списке

(порядковые номера вызывают кучу минусов
(в быстродействии перестановок),
хранение порядка целиком ограниченно максимальной размерностью списка
(1000 элементов в JSON могут обойтись ~4x1kb,
только на одном узле, а если больше?)
Поэтому выбраны динамические списки для хранения порядка.
А вообще лучше NoSQL использовать, например: neo4j
Псевдокод:
=============================
добавление(prev,this)
=============================
1. var @a=SELECT prev;
2. if EXIST(a):
3. INSERT
  this.prev=a;
  this;
=============================
перемещение(this,pos)
/*pos == idElem на место которого вставляем*/
=============================
1. c=count()
2. if posкопируем @соседей перемещаемого.
3.  SELECT this.prev() INTO @pr,
   this.next() INTO @tn;
сшиваем дырку под ними
4.  UPDATE tn.prev()=pr;||null
5.  UPDATE pr.next()=tn;||null
делаем разрыв перед pos, последним действием
  SELECT pos.prev INTO @ppv;
6.  UPDATE this.prev()=ppv; 
7.  UPDATE this.next()=pos;
8.  UPDATE ppv.next=this;
9.  UPDATE pos.prev=this;
==============================
удаление
==============================
1.  SELECT this.prev() INTO @pr,
   this.next() INTO @tn;
2.  UPDATE pr.next()=tn;
3.  UPDATE tn.prev()=pr;

Внимание!: Код экспериментальный. Вносите замечания.
Из замеченного: 
*все перезаписываемые связи 
предварительно дублировать в переменные, 
т.к. возможно наложение, например при 
одновременных вызовах со старого образца 
* предотвращение зацикливания

Комментариев нет:

Отправить комментарий