Autor Zpráva
Jont
Profil
Ahoj,
dělám teď databázi a narazil jsem na jeden problém, s kterým si nevím rady. Chtěl bych u každého, řekněme článku, mít jeho tagy (ty krátké popisky, co znáte). Takže mám tabulku clanky a tam třeba sloupec tagy.

Jde do toho pole uložit více tagů? Jako že by by byly třeba odděleny středníkem nebo nějak. Pak ale právě nevím jak pak vypsat všechny ty tagy a jak s nimi dále pracovat. Je lepší mít zvláštní tabulku tagy a do toho pole dát jenom id toho tagu?
Nebo se to dělá nějak jinak?

To stejné se hodí třeba pro uložení oblíbené položky uživatele (třeba oblíbená jídla nebo něco).

Opravdu by mě to zajímalo, poraďte prosím.
tiso
Profil
Vzťah tabuliek clanky:tagy je m:n, takže sa to rieši tromi tabuľkami:
clanky(id, ...)
tagy(id, ...)
clanky_tagy(clanek_id, tag_id)
yFang
Profil
Jont
Budeš mít tři tabulky:
clanky -< clanky_tagy >- tagy

A ve spojovací tabulce (clanky_tagy) budeš ukládat id článku a tagu.

* Pozdě. :)
keeehi
Profil
tagy by klidně v DB mohly být uloženy a jednom sloupci a odděleny středníkem.

při výstupu z db se použije funkce explode
Jont
Profil
Takže když budou ke článku 4 tagy, tak v té tabulce clanky_tagy budou 4 řádky, jo?
No to mě taky napadlo, ale není to nějak neekonomické? Ta tabulka pak bude kilometr dlouhá :).
tiso
Profil
Jont - všetko záleží od toho čo s článkami a tagmi chceš robiť... Základ je navrhnúť databázu podľa pravidiel, dosiahnuť niektorú normálovú formu. Denormalizácia nastupuje až potom.
Jont
Profil
Já se v těch pojmech moc nevyznám a nějaká pravidla moc neovládám. Každopádně bych asi jen chtěl ty tagy zobrazit u článku a pak udělat nějaké mračno.

keeehiA jak je pak vypsat? Asi by to chtělo zjistit, kolik tam těch tagů je. V polích se moc nevyznám, je na to nějaká funkce?
tiso
Profil
Jont - keď sa nevyznáš, tak študuj...
keeehi
Profil
primitivní vypsání může vypadat takto:
 //do proměnné $tagy se už předtím umístily tagy oddělené středníkem

$tagy_pole = explode(";",$tagy);
foreach($tagy_pole as $tag)
{
echo "Tag ".++$i." je: ".$tag.".<br>\n";
}
Mastodont
Profil
Jont
Počet řádků v db tabulkách většinou není omezen, buď v klidu.
Kajman_
Profil *
keeehiova verze přináší komplikace pokud podle tagů chcete i vyhledávat atp. databáze nebude moci použít indexy, takže to bude zbytečně pomalé.

Použite to, co radí tiso, četnost tagů zjistíte jednoduše
select tag_id, count(*) pocet from clanky_tagy group by tag_id

a např. takovouhle jednoduchou věc prostě v keeihově návrhu databáze nedokáže.
Jont
Profil
Ok, tak udělám tu zvláštní tabulku, přece jen to bude lepší. Dík za radu.
Jont
Profil
Ještě dotaz: Jak ty tagy seřadím podle četnosti? Nějak přes order by asi, ale co tam dát, to nevím.
Jont
Profil
Určitě to nějak jde, ne? Nebo musím k tagu ukládat jeho počet?
nightfish
Profil
... order by count(tag_id) desc
Jont
Profil
A kam se to má dát? Když to dám takhle: GROUP BY tag_id order by count(tag_id) desc tak píše invalid use of group function a obráceně mám prý chybu v syntaxi. Jsem z toho jelen.
Kajman_
Profil *
Tyto dvě varianty by měly fungovat...
select tag_id, count(*) pocet from clanky_tagy group by tag_id order by 2 desc
select tag_id, count(*) pocet from clanky_tagy group by tag_id order by pocet desc

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: