Moro! Olen tässä yritänyt pähkätä, että mitenkä seuraavanlainen tilanne hoidetaan:
http://i.imgur.com/g0R6q42.jpg
Kuvassa olisi siis kaksi taulua, yhdessä on henkilöitä ja PK olisi ID. Toisessa taulussa PK olisi int_ID joka pitäisi yhdistää ekaan tauluun. Oletetaan, että käyttäjällä on edessään valikko jossa voidaan ruksia erilaisia harrastuksia. Mikäli käyttäjä vaikka ruksii tanssiminen ja hölkkääminen niin kuinka haku tehdään jotta tuloksena tulisi ne joilla käyttäjät jotka ovat valinneet 1 tai 3? Voiko yhdessä solussa olla useampia arvoja? Suunnitelmissa olisi esim. että rekisteröimisvaiheessa käyttäjä voisi valita nuo harrastukset.
Yksittäisten tulosten hakeminen onnistuu, mutta ongelmia nousee jos yhdellä ihmisellä on useampi aktiviteetti listattuna. Kuinka asia hoidetaan oikein?
Tee kolmas taulu, jossa on sarakkeet ID ja int_ID, ja tallenna siihen tiedot henkilöiden harrastuksista. Silloin harrastusten hakeminen onnistuu helposti JOIN:illa.
kolmas taulu, kuten jo sanottu. Koska käyttäjillä voi olla useita harrastuksia ja harrastuksilla useita harrastajia, on suhde n:n.
Kolmas taulu sisältää siis tiedon kuka harrastaa ja mitä [userid,hobbyid].
Lue vaikka tämä kohdasta viitteet ja suhteet: http://appro.mit.jyu.fi/2007/syksy/
Lainaus:
Uusi taulu, joka yhdistää omistajan ja asunnon (Monen suhde moneen). Henkilö voi omistaa useita asuntoja ja asunnolla voi olla useita omistajia
Kiitti. Mä yritän huomenna. Laitan viestiä jos ei onnistu
No. Try not. Do... or do not. There is no try.
Äh, menin nyt sekaisin.. Mutta mikä tuossa kolmannessa taulussa olisi sitten PK? Vaikka miten yritän miettiä tilannetta niin taulut menee solmuun jos yhdellä henkilöllä on kaksi harrastusta.. Olisiko laittaa tauluista esimerkkikuvaa ja kertoamitä tapahtuu?
Onko tarkoitus siis tehdä useita rivejä yhdelle henkilölle? Eikö siinä tule ongelmia jos henkilö vaihtaa harratuksia myöhemmin? Kiitoksia.
Pääavain voi hyvin olla yhdistelmä sen taulun molemmista sarakkeista, koska tämä pari on aina uniikki (samalla henkilöllä ei voi olla samaa harrastusta kahteen kertaan).
Ensimmäisessä taulussa sinulla on siis henkilöt, esimerkiksi
HENKILO id | nimi ----------- 1 | Petteri 2 | Hannu 3 | Ville 4 | Anna
Toisessa taulussa lista mahdollisista harrastuksista, esimerkiksi
HARRASTUS id | harrastus ----------- 1 | Potkupallo 2 | Lätkä 3 | Shoppailu 4 | Juoksu
Ja kolmas taulu vain liittää henkilöt oikeisiin harrastuksiin, esimerkiksi
HENKILO_HARRASTUS henkilo_id | harrastus_id ------------------------- 1 | 1 1 | 3 2 | 1 3 | 3 3 | 4
kertoo, että Petteri harrastaa Potkupalloa ja Shoppailua, Hannu harrastaa Potkupalloa, Ville harrastaa Shoppailua ja Juoksua ja Anna ei harrasta mitään.
Jos henkilön harrastukset muuttuvat, niin lisäät ja/tai poistat tuosta kolmannesta taulusta rivejä tarpeen mukaan.
kamppis kirjoitti:
Onko tarkoitus siis tehdä useita rivejä yhdelle henkilölle? Eikö siinä tule ongelmia jos henkilö vaihtaa harratuksia myöhemmin?
Vaikka Sami tämä jo selittikin niin selitän minäkin :D ...
Oletetaan että on sosiaalisen median sivu, esim facebook - jos se yhtään helpottaa ymmärtämistä. On käyttäjiä ja sivuja joista tykätä. Käyttäjä voi tykätä montaa sivua ja sivusta voi tykätä monta ihmistä (suhde monta:monta).
Luodaan siis taulu sivutykkäykset (pagelikes). Tässä taulussa pääavain voi olla pagelikeid. yhdellä rivillä on siis pagelikeid (PK), userid (FK), pageid (FK), timestamp (aika koska tykätty).
yms...
Kun poistetaan tykkäys, poistetaan rivi jossa käyttäjä X ja sivu Y
Nyt aukes! Kiitoksia! Jatkamme siis tästä!
Jos sinulla on harrastuksia josta käyttäjän pitää valita, niin
checkboxien arvot voi nopeasti tallentaa kantaan jotenkin näin (en ole testannut kuitenkaan, katsoin stackoverflowsta.)
<input name="harrastukset[]" type="checkbox" value="1"/>... Golf <input name="harrastukset[]" type="checkbox" value="2"/>Tennis <input name="harrastukset[]" type="checkbox" value="3"/>Lenkkeily <input name="harrastukset[]" type="checkbox" value="4"/>Ohjelmointi
value on harrastuksen id, tämä voidaan generoida suoraa tieokannasta.
koodissa käydään valitut arvot läpi loopilla:
$harrastukset = $_POST['harrastukset']; //looppi: foreach($harrastukset as $harrastusid) { echo "{$harrastusid} valittub<br/>"; //sql-lause, insert/delete ... $query->prepare("insert into harrastajat ... ..."); }
ps. saa korjata jos olen ihan väärässä
Toimii täydellisesti. Tehdääs nyt jatkokysymys samontein. Pitäisi sisäistä postia lähettää käyttäjien välillä. Onko tähän jotain ns. "oikeaa" tapaa jota kaikki käyttää vai pitääkös tässä vain kylmästi kikkailla tietokantojen avulla? Kuinkas tietty käyttäjä pystyy saamaan hälytyksen uudesta postista? Ainakin postit voisi osoittaa oikeille henkilöille ID:n avulla hmm.
Jotain tälläistä olisi mielessä:
Tietokannassa on taulukko postien lukumäärälle. Kun käyttäjä kirjautuu sisälle niin katsotaan tietokanta läpi ja verrataan aiempaa tulosta. Mutta mihinkä noita tuloksia sitten tallennettaisiin niin, että ne ovat vertailukelpoisia. Vai yritänkö vaikeimman kautta?
Jos tarkoitus on tehdä joko yksityiset viestit -tyyppinen systeemi, niin teet taulun johon teen sarakkeet: id, viesti, lähettäjä_id, vastaanottaja_id, luettu. Kun uusi viesti lähetätään luettu-sarakkeen arvo on false ja kun viesti on avattu vaihdetaan sen arvoksi true. Sitten esim. pollataan ajaxia käyttäen et löytyykö kirjaantuneelle henkilölle uusia lukemattomia viestejä ja tehdään ilmoitus. Tietenkin on oikeastaan fiksua tehdä oma taulu viestiketjuja varten ja yhteen viestiin vaan tallennetaan vielä viestiketjun id.
Juuh :). Sain tuon toimimaan raakileversiona. Viestit saan menemään perille ja luettua ja ne näkyy tietyiltä henkilöiltä. Seuraava vaihe on tuo luettu-sarakkeen tekeminen. Mielenkiintoista!
Itse laittaisin viestiin lähetysajan ja tekisin myös luettu-sarakkeesta aikaleiman (lukemattomassa viestissä NULL).
Joo, voi se olla parempi laittaa aikaleima, niin ainakin voidaan todentaa, koska viesti on luettu ja sitten jos halutaan tehdä sellainen facebook-tyylinen "nähty"-systeemi, niin siitä saa kivasti sen ajankin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.