database zoekprobleem

Status
Niet open voor verdere reacties.

jeel2008

Gebruiker
Lid geworden
30 okt 2008
Berichten
839
hallo, stel ik wil een database van voetballers. ik maak een record.

1. speler : Jan jansen 2. speelde voor: ajax, feyenoord, psv 3. woonde in: haarlem, amsterdam

ik heb dus 3 tabellen: speler, club, stad.
later ga ik zoeken. ik wil alle spelers die jansen heten en voetbalden voor ajax en psv
dan loopt te boel hier al vast dus.
want ik heb een tabel Spelers. maar geen tabel Ajax en PSV.(alleen een tabel: clubs). dus ik kan niet zeggen:
zoek jansen in de tabel ajax en in de tabel PSV.

dus pak ik het anders aan. maar dan moet ik van alle eredivisieclubs een tabel maken.
en dan moet ik jansen invullen bij ajax, psv en feyenoord.

nu kan ik zoeken op: zoek alle jansens die speelden bij ajax, psv.

leuk en aardig, maar dan moet ik dus steeds met die naam jansen gaan lopen zeulen.
dan moet ik hem dus wel 3 x invoeren. (in de tabel ajax, feyenoord en psv).

is dit de manier?
 
Laatst bewerkt:
Nee, lijkt mij niet de manier...

Je hebt een tabel "Voetballers" daarin heb je dan 4 velden(geen tabellen):
-id
-speler
-club
-stad

Je kunt dan met een SELECT query, de gewenste resultaten ophalen.

BIJV.


SELECT * FROM voetballers WHERE speler='janssen' AND club='twente' ;

Even heel simplified gezegd, je kunt dan ook nog om het jezelf te vergemakkelijken door met LIKE te gaan werken voor speler, een losse tabel eredivisieclubs aan gaan maken en daarmee een join te maken om je server werk te besparen.

Kun je hier iets mee?

Ik weet niet heel precies wat exact je bedoeling is, zoals je het beschrijft is het een hele grote stel dat.geef me eens een situatieschets, die toespitst op wat je wil bereiken...
 
Laatst bewerkt:
database

nou, ik wil een site opzetten over voetballers in nederland. (heb ik vroeger al eens gedaan, ism met een engelse vriend die dat van engelse voetballers doet: where are they now).
dat wordt een hele grote site dus ik wil m direct goed opzetten.
maar je antwoord brengt me wel ergens. je kan dus een query opgeven die de VELDEN afschuimt. ik dacht dat je zocht op tabelnamen, bv de tabel
speler ajax feyenoord haarlem amsterdam
vijf kolommen zouden dit zijn
daaronder de velden die ingevuld worden
maar ik kan dus beter dit doen:
-id
-speler
-club
-stad

maar wat vul ik dan in bij club als het meer dan 1 club is?
moet ik dan club1 club2 club3 doen?
dus 3 zoekvelden, of meer.
of kan ik in 1 zoekveld zoiets doen: ajax, feyenoord, psv
gescheiden door een komma en dat de query begrijpt dat dus na de komma nieuwe informatie begint?
 
Nee, je zoekt voornamelijk op velden(afhankelijk van wat je exact wil doen natuurlijk).

Wat jij wilt zou ik(ben zelf verre van ervaren, dus als iemadn het beter weet, fill me in please) het volgende doen, je clubs zijn variabel en kunnen meer spelers aan, hoe wil je gaan zoeken? wordt de club een criterium? dan zou ik zeggen maak een aparte tabel voor de clubs aan, geef deze een getal waarde als id, wanneer je ze bijv. in een select laat zien geef je die values (id) op, en dan kun je gebruik maken van de LIKE in een query, kijk eens op w3schools.com voor meer informatie daarover.

Mocht je r niet uitkomen , help ik je graag maar dat wordt op zn voregst morgenavond.
 
database

Even heel simplified gezegd, je kunt dan ook nog om het jezelf te vergemakkelijken door met LIKE te gaan werken voor speler, een losse tabel eredivisieclubs aan gaan maken en daarmee een join te maken om je server werk te besparen.

ik moet het allemaal even tot me laten doordringen, maar wat je hier zegt zit iets in denk ik. een tabel met clubs, zeg maar 30 clubs.
moet ik dan handmatig het ID van speler jansen invoegen in de clubs waar ie gespeeld heeft? dan valt het nog mee, want ik hoef slechts zn IDnummer in te vullen.

maar ik dacht , als dit zo is, misschien is er NOG n snellere manier.
 
Als je het goed wilt doen, moet ie zo:

Voetballer
-ID
-naam
-overige relevante data

Club
-ID
-naam
-overige relevante data

Voetballer_speelde_voor
-koppelID
-voetballerID
-clubID
-begintijd
-eindtijd


Dan kun je alle jansens zoeken die voor Ajax speelden door dit te doen:

[sql]
SELECT *
FROM voetballer, club,
INNER JOIN voetballer_speelde_voor ON voetballer.id = voetballer_speelde_voor.voetballerID
INNER JOIN club ON club.id = voetballer_speelde_voor.clubID
WHERE voetballer.naam = "Jansen" AND club.naam = "Ajax"
[/sql]

Als je dat niet goed begrijpt, moet je maar roepen dan leg ik em helemaal uit ;) Maar je moet data nooit meer dan 1x opslaan in een database.
 
voetballers

hallo frats,
bedankt, ziet er overzichtelijk uit.
toch noch enkele vragen:
over de bijlage dbv.jpg:

  • is het nou slim om hier ook de clubs op te geven waarvoor ie gespeeld heeft, of niet? *
  • met dat blob, is dat slim? ik wil er een plaatje bij. of kan ik gewoon beter handmatig een path naar een fotobestand op de server in het veld ' image ' zetten?
(of snap ik het niet, kan ook hoor).

* of wordt dat hier bepaald, bij Voetballer_speelde_voor?


over de bijlage tabel.jpg
ik heb hier min of meer bewust fouten gemaakt, denk ik.
want ik kan denk ik niet 001 als id bij zowel club, speler als koppeling geven, of snapt mysql dat een 001 uit een andere tabel ook een andere id is? (bijvoorbeeld dat ie de ids op deze manier opslaat: club_001, speler_001, koppeling_001, zoiets.
(maar wat ik aanneem is dat ie ids automatisch aanmaakt. (auto-increment).
maar als ik dan met spelers invoeren bezig ben en ik stop bij id008, en ik doe tussendoor een club, maakt die dan van de eerste club id009?. dat het hem geen zier uitmaakt waar, in welke tabel, het id staat, zolang het maar een uniek getal is.)

kan ik doen wat ik gedaan heb bij 1961 (januari)? bv een speler is halverwege het seizoen van club veranderd, hoe geef ik dat aan?

oh ja, en dat tussenvoegsel...of kan ik beter bij achternaam zetten : herpen, van
dus dat 'van' ook in de kolom achternaam?
maar dan krijg je weer een probleem als je op 'herpen' zoekt, dan vindt ie m niet

en de INT bij bv voetballers, hoe moet ik de lengte weten? ik weet niet precies hoeveel voetballers er zullen zijn
 

Bijlagen

  • dbv.jpg
    dbv.jpg
    68,9 KB · Weergaven: 40
  • tabel.jpg
    tabel.jpg
    48,9 KB · Weergaven: 44
Laatst bewerkt:
Maar je moet data nooit meer dan 1x opslaan in een database.

Geldig in de meeste gevallen, maar in sommige gevallen is het juist beter om je data niet-genormaliseerd op te slaan (omdat dit de performance ten goede komt bijv.).
 
He Jeel,

Zal je vragen even allemaal langslopen:

Je moet (vrijwel) nooit meerdere rijen met hetzelfde type data opnemen in een tabel. De club waar een speler nu voor speelt kun je het beste ook koppelen via een koppeltabel.

Een BLOB is een optie voor plaatjes, maar het opslaan van een pad is vaak beter; dat kun je namelijk veel makkelijker linken. Het is namelijk een stuk lastiger om een BLOB te outputten op het scherm dan een gewoon plaatje; een simpel linkje is niet mogelijk, je zult om een plaatje te tonen dus een script moeten runnen en dat is niet goed voor je performance vaak, daarnaast trek je veel te veel data over je verbinding als je een select * doet en daarbij (voor niks) een hele zooi plaatjes ophaalt. Vandaar dat het meestal niet met BLOB gedaan wordt.

Verder zijn IDs alleen uniek binnen hun eigen veld. Het is dus geen enkel probleem dat zowel een club als een voetballer id 1 hebben; het is niet meer dan een getal. Omdat je tabellen aan elkaar koppelt via bepaalde velden komt dat meestal wel goed; maar je kunt ook hele onzinnige koppelingen doen (bijv SELECT * FROM voetballer INNER JOIN club ON voetballer.id = club.id) en daar komt dan ook hele onzinnige data uit.

Je kunt het beste een apart veld van achternaam en tussenvoegsel maken; dat is inderdaad praktischer. En het getal bij een INT; over het algemeen maakt het vrij weinig uit. Zet em op 10 ofzo en je kunt nog wel een paar jaar vooruit; INTs kosten zo weinig geheugen dat het niet zo'n bezwaar is.
 
Geldig in de meeste gevallen, maar in sommige gevallen is het juist beter om je data niet-genormaliseerd op te slaan (omdat dit de performance ten goede komt bijv.).

Als je voor performance gaat is het vaak verstandiger om data te cachen, niet om het dubbel op te slaan. Voor elke regel is een uitzondering, dat ben ik met je eens, maar performance kan vaak (niet altijd) efficienter via caching en ik zou dubbele opslag echt bewaren tot de allerlaatste oplossing.
 
voetballers

hallo frats, even ter controle, is dit wat je ongeveer bedoelt, zie images?
en is dat oke zo met die IDs bij voetballers3? en die null waarden ,heb ik dat begrepen. (bv tussenvoegsel, niet elke naam heeft een tussenvoegsel, dus beginwaarde is dan NULL? of slaat NULL op iets geheel anders?)

ps nog iets: ik heb net wat gegevens ingevuld en kreeg dit bericht:
#1062 - Duplicate entry '0' for key 1
ik neem toch aan dat ik de primary keys niet zelf handmatig in moet voeren.
ik denk dus dat dit komt omdat ik auto increment niet heb ingevuld,ik probeerde dit alsnog te doen , zie wijzging2.jpg maar kreeg toen deze opmerking:
#1067 - Invalid default value for 'ID'
wat nu?

en dan laatste vraag:
bij voetballers3.jpg
de koppelID maakt ie zelfstandig aan? maar de andere2 ID's die moet ik dus handmatig invullen? gewoon het idnummer van de betreffende speler of club overnemen uit de andere tabellen?
 

Bijlagen

  • voetballers1.jpg
    voetballers1.jpg
    94,5 KB · Weergaven: 43
  • voetballers2.jpg
    voetballers2.jpg
    95,1 KB · Weergaven: 28
  • voetballers3.jpg
    voetballers3.jpg
    92,9 KB · Weergaven: 48
  • wijzigen.jpg
    wijzigen.jpg
    65,1 KB · Weergaven: 42
  • wijzging2.jpg
    wijzging2.jpg
    60,2 KB · Weergaven: 28
Laatst bewerkt:
Id

hallo, laatst schreef frats dat ik dit moest doen om voetballers te kunnen vinden bij club en in jaartallen:

Als je het goed wilt doen, moet ie zo:

Voetballer
-ID
-naam
-overige relevante data

Club
-ID
-naam
-overige relevante data

Voetballer_speelde_voor
-koppelID
-voetballerID
-clubID
-begintijd
-eindtijd


ik heb 1 vraag: moet ik die voetballer ID en club ID dan handmatig invullen in de tabel KoppelID?
 
Je zult de koppeltabel helaas zelf in moeten vullen; het systeem kan niet weten voor welke clubs de voetballers gespeeld hebben. Misschien kun je met een paar slimme queries de data uit je vorige model overzetten, dat zou nog een optie kunnen zijn. Mits je die niet weggegooid hebt...
 
ids

hallo frats, ok,
maar dan moet ik dus heel goed opletten.
stel dat ik in de tabel club de eerste speler heb met id: 001.
dan in tabel jaartallen ook de eerste met : 001.
dan kom ik in de tabel koppeling, en de eerste koppeling ziet er dan zo uit:
koppeling 1 , id: 001.
club id 1: id 001
jaar id 1: id 001.
weet het progamma dan dan ik de 001s heb overgenomen uit verschillende tabellen?
ik neem aan van niet. voor hem zijn het nu, nu ik ze uit hun bestaande tabel heb gerukt en in een nieuwe tabel heb geplakt gewoon dezelfde nummers, of niet?
 
1 heeft geen bijzondere waarde :) Wat het systeem weet, is dat je een 1 hebt ingevuld bij voetballer, een 1 bij club en een 1 bij algemene id. Op het moment dat je gaat koppelen moet je dat zelf goed koppelen, maar doordat je altijd koppelt op hetzelfde type werkt dat.

Je query ziet er zo uit:
[sql]
SELECT *
FROM voetballer
INNER JOIN voetballer_speelt_voor ON voetballer.id = voetballer_speelt_voor.voetballer_id
[/sql]
(loos voorbeeld)

Omdat je in voetballer_speelt_voor bij voetballer_id hetzelfde getal hebt opgenomen als bij voetballer.id, kun je op deze manier die getallen weer samenvoegen.

Ga er vanuit dat het werkt :P Als je het echt wil weten dan moet je het eea leren over hoe queries precies werken, kan ik je vast uitleggen ook, maar dat is best wel droge theorie.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan