Portál AbcLinuxu, 6. května 2024 12:27


Dotaz: Jaky db model na cislovanie uloh pouzivatelov od 1 pre kazdeho zvlast

21.9.2011 16:01 polymorf | skóre: 14 | blog: tar_zxpf
Jaky db model na cislovanie uloh pouzivatelov od 1 pre kazdeho zvlast
Přečteno: 485×
Odpovědět | Admin
Mam tabulku pouzivatelov (user.id, user.name) a tabulku uloh (task.id, task.userId, task.order, task.uloha) - pripadne to moze byt aj inak usporiadane ak to viete inak, lepsie. Chcel by som dosiahnut, aby ulohy boli cislovane poradim od 1 hore pre kazdeho usera zvlast, napr:
user:
1 janko
2 ferko

ulohy (jankove):
1 1 1 vyniest kos
2 1 2 umyt riad
3 1 3 domace ulohy

ulohy (ferkove):
4 2 1 namalovat plot
5 2 2 vyvencit psa
Mozem vytvorit unikatny index (task.userId, task.order) ktory mi zabezpeci ze user nebude mat duplicitne poradie uloh, ked zacnem robit operacie ako zmena poradia uloh tak si budem musiet vsetko oprogramovat sam. Napr. ak by som chcel jankovi zmenit poradie "Domace ulohy" z 3 na 1 tak to musim robit takto:
- ulohe 1 priradim nejake pomocne poradie, napr. 4
- ulohe 3 nastavim poradie 1
- ulohe 2 nastavim 3
- ulohe 1 nastavim 2
Co sa mi da dost komplikovane. Neunika mi nejaka jednoduchsia cesta? Uvazujme mysql alebo postgres. Napadol ma spojovy zoznam ale tam asi selekt s triedenim podla cisla poradia nebude trivialny. Kazdy user by nemal mat viac ako 200 uloh (resp. za poslednych 5 rokov realnej prevadzky maximum bolo 120) cize ak viete nejake trivialne ale pomale riesenie, nie je problem pouzit aj to.


Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

21.9.2011 20:38 jekub
Rozbalit Rozbalit vše Re: Jaky db model na cislovanie uloh pouzivatelov od 1 pre kazdeho zvlast
Odpovědět | | Sbalit | Link | Blokovat | Admin
ulohe 1 priradim nejake pomocne poradie, napr. 4
na co pomocné pořadí, když máme null

Každopádně postgres by měl umět DEFERRABLE constraints. Jak MySQL nevím.
21.9.2011 21:47 l0gik | skóre: 22
Rozbalit Rozbalit vše Re: Jaky db model na cislovanie uloh pouzivatelov od 1 pre kazdeho zvlast
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud chceš změnit pořadí všech/více, nejprve jim všem nastav null a pak je nastav jak chceš.

Jestli chceš vyměnit pořadí dvou, pak použij
UPDATE ulohy SET order = IF(JSEM A, nové pořadí A, nové pořadí B)
V postgresql i v mysql jde k témuž co v mysql dělá IF použít
CASE WHEN ... THEN ... ELSE ... END
.
Tarmaq avatar 22.9.2011 11:52 Tarmaq | skóre: 39
Rozbalit Rozbalit vše Re: Jaky db model na cislovanie uloh pouzivatelov od 1 pre kazdeho zvlast
Odpovědět | | Sbalit | Link | Blokovat | Admin
Vyresil bych to pomoci BEFORE INSERT/BEFORE UPDATE triggeru nad tabulkou tasks.
V before insert triggeru by melo stacit zaridit neco jako:
UPDATE task
SET order_ = order_ + 1
WHERE order_ >= NEW.order_
  AND user = NEW.user_
;
V before update triggeru:
UPDATE task
SET order_ = 0
WHERE id = OLD.id
;
IF OLD.order_ > NEW.order_ THEN
  UPDATE task
  SET order_ = order_ + 1
  WHERE order_ < OLD.order_
    AND order_ >= NEW.order_
    AND user = NEW.user_
  ;
ELSIF OLD.order_ < NEW.order_ THEN
  UPDATE task
  SET order_ = order_ - 1
  WHERE order_ > OLD.order_
    AND order_ <= NEW.order_
    AND user = NEW.user_
  ;
END IF;
Don't panic!
1.10.2011 07:58 VM
Rozbalit Rozbalit vše Re: Jaky db model na cislovanie uloh pouzivatelov od 1 pre kazdeho zvlast
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pořadí bych do databáze neukládal, dal bych tam místo toho prioritu. Pořadí by vzniklo až při čtení úloh daného uživatele - order by priority, task_id nebo order by priority+task_id.

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.