Autor Zpráva
speedees
Profil
Zdravím,

pokouším se vyřešit následující problém.
V nějaké webové aplikaci (v databázi MySQL) mám tabulku "Uživatelé" s klasickými atributy treba, "jmeno","prijmeni".

Chtěl bych udělat, aby administrátor mohl přidávat/odebírat atributy uživatelů, ale nemyslim pomocí phpMyAdmin, ale prostě dynamicky v nějakém vytvořenén admin. rozhraní.

Dám příklad: Admin se třeba rozhodne aby si každý do profilu mohl přidat svoji web. stránku.
Tak dá (pomocí nejakého formuláře) vytvořit nový atribut, který bude typu řetězec, a bude se jmenovat "Web". A od ted se bude každému uživateli zobrazovat v profilu prázdný input s textovým polem.

Dál se třeba rozhodne, že přidá znamení (horoskop). Tak dá vytvořit atribut typu radiobutton, řekne že bude mít 12 hodnot, a tyto hodnoty postupně zadá. A od ted se budou každemu uživateli zobrazovat na profilu radiobuttony na výběr ze dvanácti znamení horoskopu.


Pokusil jsem se vytvořit ERD
http://fcvelka.ic.cz/dm/export.png

Ted když admin zadá nový atribut jménem "Web" (do tabulky ATRIBUT) tak do datového typu uloží nějaký identifikátor řetězce (třeba řetězec=0, číslo=1, radiobutton=2, checkbox=3). Jednotlivé hodnoty uživatele na atributu (web.stránky) se ukládají v tabulce Hodnota_uziv_atributu.

A když se rozhdne přidat horoskop. Tak zase určí datový typ 2 (radiobutton). Řekne že předdefinovaných hodnot bude 12. Tyto hodnoty zadá a budou uložené v tabulce HODNOTY.

Snad jsem to dobře popsal, možná až moc podrobně.
Jestli někdo bude mít chut se k tomu vyjádřit, tak budu rád.
Myslíte, že je to naprogramovatelné v PHP? Nebo bude někde nějaky problém?
Nerad bych se do toho pustil a pak zjistil, že se to dalo třeba udělat nějak jednodušeji, nebo líp.
Budu rád za každý odkaz, který mně nějak navede.

Tak zatim díkec!
tiso
Profil
speedees
1. problém je ten, že síce udávaš dátový typ atribútu, ale hodnoty ukladáš do jedného stĺpca. Aký bude mať dátový typ ten?
2. problém je vzťah uživatel: atribút, ty si ho namodeloval ako M:N, ale v skutočnosti bude skôr 1:1(web), prípadne. M:1(horoskop), nie? Máš príklad na M:N ?
speedees
Profil
1. problém
Ano, to už mně taky napadlo. Tak buď to bude řetězec, a když bude zadano číslo tak budu ten řetězec konvertovat na int. A nebo přidám další sloupec treba HODNOTA_INT.

2. problém
Kdyby třeba admin přidal do profilů:
Jaké sporty děláte? Fotbal,hokej, tenis, další - tak ted by uživatel zaškrtával checkboxy a to už by bylo M:N
Nebo ne?
tiso
Profil
speedees
2. môže byť
3. problém - ako vyberieš k userovi konkrétnu hodnotu atribútu?
speedees
Profil
3. problém

No když to bude jen jedna hodnota třeba ta web. stránka tak je to jasné. Je uložena v Hodnota_uziv_atributu.hodnota.
SELECT hodnota FROM Hodnota_uziv_atributu WHERE ID_USER="1" AND ID_ATRIBUTU="1"

Pokud to bude třeba ten horoskop tak tento select
SELECT hodnota FROM Hodnota_uziv_atributu WHERE ID_USER="1" AND ID_ATRIBUTU="1"
vrátí nějaké číslo. např 2
Seřadím abecedně záznamy z tabulky HODNOTY.hodnota WHERE ID_ATRIBUTU="1". Mrknu se na 2. záznam a mám tu konkrétní hodnotu.

Teď by to ale dělalo problémy pokud bych tam nějakou novou hodnotu přidal (po seřazení abecedně by se to všechno mohlo posunout). Tak bych to taky mohl udělat tak, že v tabulce HODNOTY přidám další sloupec třeba zase HODNOTA_INT a když mi ten původní SELECT vrátí třeba 2, tak se mrknu kde je HODNOTA_INT 2 a to vrátím.

Asi to neumím dost dobře popsat, ale myslím, že to fungovat bude. Asi to zjistím jedine tak, že to zacnu programovat.
TomášK
Profil
Zdá se mi, že trochu znásilňuješ databázi - vytvářet tabulku, do které uložíš datový typ, případně hodnotu se mi zdá zvrhlé. Zvolil bych úplně jiný přístup.
Když bude admin chtít přidat sloupec horoskop, tak bych do tabulky `Uživatelé` přidal sloupeček `horoskop`, který by měl třeba datový typ ENUM, aby se z něj dobře vytvářely radiobuttony nebo sloupeček VARCHAR pro `web` - aneb přesně tak, jak bys do dělal v phpmyadminovi, kdybys to dělal sám.
SQL na to má dotazy, které začínají ALTER TABLE, můžeš pomocí nich přidávat sloupce, měnit sloupce, odstranit sloupce... phpmyadmin nedělá nic jiného než že volá tyhle dotazy - můžeš zkusit přidat sloupec a pak se podívat, jaký dotaz vygeneroval a použít ho, nebo se inspirovat dokumentací - viz http://dev.mysql.com/doc/refman/5.1/en/alter-table.html
Mastodont
Profil
Atributy by měly být přidávány do tabulky jako další sloupce. Možné hodnoty atributů bych osobně ukládal do pole a to serializoval.
TomášK
Profil
Možné hodnoty atributů bych osobně ukládal do pole a to serializoval.
Jakou má tohle výhodu oproti ENUMu ( http://dev.mysql.com/doc/refman/5.0/en/enum.html )? Výhody ENUMu vidím v tom, že je to čistší (možné hodnoty jsou přímo v databázi, není to závislé na php a asi i efektivnější - mysql to podle mě lépe než serializované pole.
Mastodont
Profil
TomášK
Případnou chybu zachytíš ještě před odesláním do databáze - takové kontroly bys měl provádět vždy. V databázi samozřejmě ENUM klidně používej.
speedees
Profil
TomášK

Asi je to tak lepší.
Když nad tim přemýšlím víc...určitě je to tak lepší. Marně se snažím najít nějaký příklad, který by na tom nefungoval.
S dat. typy ENUM a SET jsem jeste nedělal.

MastodontMožné hodnoty atributů bych osobně ukládal do pole a to serializoval.
Myslíš jako ukládat někam do textového nebo xml souboru? Nějak nerozumím pojmu "serializovat".
Díky za upresnění.
TomášK
Profil
Pokud by se ti nellíbil datový typ enum, můžeš použít místo něj další tabulku - klasický vztah 1:N (uživatel má horoskop). Je to o něco víc programování, ale lépe se to rozšiřuje.
Nějak nerozumím pojmu "serializovat".
PHP a i některé další programovací jazyky, má metody serialize() a unserialize() (snad si jména pamatuju dobře), které převedou jakýkoliv objekt na text (obvykle nepříliš čitelný), ten se dá uložit do databáze/souboru, a metoda unserialize převede ten text zpět na původní objekt.
Mastodont
Profil
Ano, ukládat do souboru. Prostě budeš mít třeba:
Array( 'atribut1' => Array( 'type' => 'ENUM', 'values' => '0;1;2;3'))

Do takového pole se dají jednoduše přidávat další prvky, přes file_put_contents + serialize to uložíš, v případě potřeby zase načteš. Pro různé konfigurace je to docela dobře použitelné.

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: