Autor Zpráva
licantrop
Profil
Zdravim.
Mám dotaz, Mám hromadu checkboxů (100-200) a mam je rozděleny do tabulek po cca 20. Uživatel si bude zaškrtávat možnosti a já pak výsledek potřebuju uložit do databáze.
Myslel jsem, že udělam několik polí (každá tabulka jedno pole, kde bude 0 - 20 záznamů) a to vložím do db. Ale nějak nevim jak na to a už si i myslim, že to tak ani nejde.
Měli by jste nějakou radu? Nebo opravdu musim dělat pro každy checkbox sloupec v db?
Jozin
Profil
Zdravím,
dávat do jednoho sloupce více záznamů je degradování databáze, ale samozřejmě to jde, například pole serializuj a ulož jako text, při čtení deserializuješ text v databázi a máš pole. Ale jak jsem psal, jedná se o degradaci databáze na uložiště, vyhledávání/indexování apod nepojede, nebo se bude muset složitě řešit v aplikační logice.

Tvé řešení co sloupec, to chceckbox by bylo naopak super co se týče hledání (příklad dotazu: vypiš všechny, co mají zaškrtnutý ten a ten checkbox; to je jednoduché), problém s tímto řešením je, když jeden checkbox přidáme, tak budeme měnit strukturu databáze.

Nabízí se ještě jedno řešení, vytvořit další tabulku, kde bude první sloupec cizí klíč na hlavní tabulku, druhý třeba název checkboxu a poslední sloupec jeho hodnota. Výhody jsou v tom, že můžeme dynamicky měnit počet checkboxů a to i mazat, nebudeme mít gigantickou tabulku (co do sloupců), ale nevýhody, čím víc checkboxů a uživatelů tím krát víc řádků v nové tabulce, dále se zesložití SQL dotaz na zjišťování dat atd. atp.

Vše má výhody a nevýhody, jaké je primární určení těch záznamů, bude potřeba checkboxy přidávat a ubírat, bude potřeba vyhledávat podle těchto checkboxů?
Joker
Profil
licantrop:
Viz časté chyby při návrhu databáze.

Nebo opravdu musim dělat pro každy checkbox sloupec v db?
I to je chyba, když něčeho může být proměnný počet a v principu jde neomezeně přidávat další, neměly by to být sloupce, ale řádky.
licantrop
Profil
Takže asi nejlepší řešení pro každý checkbox sloupec.
Vyhledávání podle checkboxů bude potřeba a ubírat ani přidávat se nebudou.
Ale ted nevim jak je to když uživatel políčko nezačkrtne, to se nic neprovede, jako by tam ten box nebyl. a to asi bude dělat zmatek v tabulce, nebo to vrací nějakou hodnotu? To si ted nejsem jistý...

A řešení ne sloupce, ale řádky, mě vubec nenapaklo. a abych pravdu řelk, ani pořádně nevim jak bych to udělal, zkusim něco najít.
Joker
Profil
licantrop:
A řešení ne sloupce, ale řádky, mě vubec nenapaklo. a abych pravdu řelk, ani pořádně nevim jak bych to udělal
Není to žádná věda.
Tabulka by vypadala nějak:
ID formuláře, ID pole, hodnota.

A pak bude ještě tabulka, kde budou případné společné údaje, jako kdo formulář odeslal apod.
Jozin
Profil
Joker:
Omlouvám se za duplicitu řešení, jen jsem to chtěl spojit se svým prvním příspěvkem.

licantrop:
Řešení co checkbox, to řádek jsem již psal, prakticky se udělá jen další tabulka, která bude mít v jednom sloupci identifikátor řádku v první tabulce (cizí klíč), pak identifikátor checkboxu a poslední sloupec je hodnota checkboxu.

"Takže asi nejlepší řešení pro každý checkbox sloupec. "
To nemusí být pravda, pravda to je jen tehdy, kdy se opravdu snažíš mít co nejjednodušší SQL, ale pokud by se v budoucnu něco měnilo, musel bys měnit strukturu databáze, s řešením co checkbox to řádek ne.
Alphard
Profil
Jozin:
pravda to je jen tehdy, kdy se opravdu snažíš mít co nejjednodušší SQL
Ani tohle zdaleka není pravda a už při 10 sloupcích tohoto by to byl dost problém u čehokoliv složitějšícho než jednoduchý select/insert všeho. Požadavky jako vrátit počet nenulových polí (typicky u checboxů), spočítat průměr (u číselných hodnot) apod. nutně vedou k potřebě vyjmenovávat všechny sloupce, někdy i několikrát. A představa, že teď známe 200 parametrů, které se nebudou změnit, se obvykle ukáže jako velmi naivní.
licantrop
Profil
Hm, tak ted teda fakt nevim...
Tak asi opravdu udělat to do těch řádek... Ale vubec nechápu jak :)
Tori
Profil
Možná by stálo za zvážení rozdělit checkboxy do logických skupin po max. 64 prvcích, a použít jeden sloupec typu BIT pro každou skupinu. Potom budete mít další tabulku, kde budou jednotlivé checkboxy: název (varchar), skupina (enum), bitValue (bit). Vyhledávání by pak vypadalo např. takhle:
-- najdi vše, co má zaškrtnuté checkboxy s názvem "jedna", "dva" nebo "tři":
SELECT t.*, GROUP_CONCAT(c1.name) AS checkboxySkupina1, GROUP_CONCAT(c2.name) AS checkboxySkupina2
FROM tabulka t
LEFT JOIN checkboxy c1 ON (t.skupina1 & c1.bitValue = c1.bitValue)
LEFT JOIN checkboxy c2 ON (t.skupina2 & c2.bitValue = c2.bitValue)
WHERE c1.name = 'jedna' AND c2.name IN ('dva', 'tři')
GROUP BY t.id

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0