database vraag

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 3 volgende »

Ozzie PHP

Ozzie PHP

09/05/2013 03:32:45
Quote Anchor link
Hallo,

Ik wil een databasetabel maken met domeinnamen die op mijn server actief zijn. Aan de hand van de URL wil ik dan gegevens over die website kunnen ophalen. Stel iemand bezoekt www.mijnsite.nl dan zoek ik in de database naar www.mijnsite.nl.

Een beetje uit gewoonte had ik deze tabel-opzet gemaaakt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
id   domein            foo
1    www.mijnsite.nl   bar

Ik begin altijd met een id (auto-increment). Echter, nu vraag ik me af of een id hier wel nodig is, omdat ik nooit op id zal zoeken maar altijd op 'domein'. Volgens mij wordt het aangeraden om altijd een id te gebruiken omdat je dan eventuele wijzigingen kunt uitvoeren op basis van het id. Maar ik ben dus wel benieuwd naar wat jullie vinden. Wel of geen id?
 
PHP hulp

PHP hulp

17/11/2024 21:42:42
 
Reshad F

Reshad F

09/05/2013 09:11:53
Quote Anchor link
Ozzie je moet zorgen dat er ALTIJD een primary key in je tabel zit. stel je hebt laten we zeggen een tabel met Medewerkers dan krijg je iets als

mdw_voornaam
mdw_achternaam
mdw_bsn_nr
mdw_geslacht etc etc

dan wil je natuurlijk een medewerker kunnen opzoeken. Het kan natuurlijk zo zijn dat er meerdere medewerkers zijn die jan heten, vervolgens zoek je ook op achternaam maar dan kom je erachter dat er ook meerdere jan jansens zijn. in dit geval kan je dan het beste mdw_bsn_nr gebruiken om op te filteren omdat dit uniek is en niet een 2e keer voor kan komen. je ziet dat ik hier dus geen gebruik heb gemaakt van een ID als primary key maar ik kan gewoon de mdw_bsn_nr gebruiken.

In jou geval denk ik dat je iets te weinig info in de database hebt gezet. want een klant van jou zal wel een klant nummer krijgen toch? dus waarom maak je niet een tabel genaamd klanten en dan maak je daar kolommen in als

klant_nummer ( primary key )
klant_naam
klant_achternaam
klant_straat
klant_kleur etc etc

en dan kan je elk klant eventueel meerdere websites geven. ( in een koppeltabel )

website_klant_nummer ( Foreign_Key )
website_domein
website_foo


ik denk dat dit bij jou het handigst is. Al zou ik persoonlijk domein toch niet als primary key willen gebruiken maar het liefst toch een ID er aan koppelen.
Gewijzigd op 09/05/2013 09:13:28 door Reshad F
 
Jan R

Jan R

09/05/2013 11:12:07
Quote Anchor link
Ik kan je wel volgen. echter zou ik een id moeten hebben in een koppel tabel?

tabel 1= leden met een id
tabel 2 zijn activiteiten ook met id.
tabel 3 (koppelingen) zijn de koppelingen wie doet mee aan welke activiteit

Nu kan voor elk lid uit tabel 1 en voor elke activiteit uit tabel 2 maar 1 link zijn. mocht er onverhoopt toch één dubbel zijn dan wordt deze automatisch gewist.

Nu zoek ik dus voor de verbindingen op de 2 id's en werkt perfect.
Zou ik dan ook hier een id van koppeling moeten hebben?

Jan
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

09/05/2013 12:02:49
Quote Anchor link
Eigenlijk moet je het niet over id's hebben maar over een primary key, in een koppeltabel maak je de combinatie van de primary keys uit de tabellen die gekoppeld worden de primary key.

In Ozzie's tabel is de domeinnaam een geschikte kandidaat voor de primary key
 
Ozzie PHP

Ozzie PHP

09/05/2013 14:58:19
Quote Anchor link
Het klopt inderdaad dat ik straks de domeinnamen wil kunnen koppelen aan een klant.

Maar mijn vraag is dus of een id en een domeinnaam niet dubbelop is, omdat een domeinnaam altijd uniek is. Die zou ik dus kunnen gebruiken als primary key. In een koppeltabel zou je dan zoiets krijgen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
id klantummer domeinnaam
1       1     www.mijnsite.nl

Maar ik heb geen idee of dit de juiste manier is. Ik ben nog niet zo'n expert met SQL.

Ik zou dus ook dit kunnen doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
id klantummer domeinnaam_id
1       1           1

Ik meen wel eens gehoord te hebben dat het handig is als een primary key een getal is, omdat dit makkelijker op te zoeken is dan een string? Klopt dat?

Wie kan me nog wat advies geven?

Moet ik het zo doen:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
id   domein            foo
1    www.mijnsite.nl   bar

of zo?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
domein            foo
www.mijnsite.nl   bar

waarbij in situatie 1 "id" de primary key is en in situatie 2 "domein".

Wie weet het antwoord / heeft tips?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

09/05/2013 18:25:19
Quote Anchor link
Ja, het is correct dat getallen wat makkelijker geïndexeerd kunnen worden dan strings.
Primary keys met een auto_increment (surrogate keys) worden bijna altijd toegepast omdat ze alleen betekenis hebben in de database, voor de buitenstaander zijn ze nietszeggend.
Dat laatste is het belangrijkste, want je wilt niet met bv iemands email adres over het net gaan lopen leuren.
Maar nogmaals het kan allebei, mijn voorkeur is een integer als PK, maar hoeft niet noodzakelijk een AI te hebben, kan net zo goed bv de barcode van een product zijn.

Maar waarom heb je een koppeltabel nodig, de relatie klant-domeinnaam is toch 1-n en niet n-n?
 
Ozzie PHP

Ozzie PHP

09/05/2013 19:30:09
Quote Anchor link
Oké, dus jouw advies is om een getal als primary key te gebruiken. Dus dan zou ik het zo kunnen laten zoals het nu is.

"Maar waarom heb je een koppeltabel nodig, de relatie klant-domeinnaam is toch 1-n en niet n-n?"

Ah, hier komen ineens wat vaktermen om de hoek waar ik nog niet zoveel kaas van heb gegeten. Wat bedoel je hier precies mee?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

09/05/2013 19:47:51
Quote Anchor link
Dat (neem ik aan) een klant meerdere domeinen kan hebben, maar een domein maar bij één klant hoort.
Dan krijg je dus een één op veel relatie tussen de klanten tabel en de tabel met de domeinen, waarin je dus het klant_id opneemt.

Koppeltabellen zijn alleen nodig als je veel op veel relatie hebt tussen twee tabellen.
 
Ozzie PHP

Ozzie PHP

09/05/2013 19:55:52
Quote Anchor link
Ah oké... dus als ik het goed begrijp moet ik in plaats van een koppeltabel te gebruiken de klant_id opnemen in de tabel met de domeinen. Dus zo?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
id   domein            foo   klant_id
1    www.mijnsite.nl   bar      1

Is dit wat je bedoelt?

(Maakt het trouwens iets uit op welke positie ik het veld klant_id zet? Staan bijv. alle keys naast elkaar, of maakt dat niet uit?)
 
Reshad F

Reshad F

09/05/2013 20:03:36
Quote Anchor link
Nee het maakt in principe niet uit op welke volgorde ze staan. en dat is inderdaad zoals Ger het bedoelt.

let wel op. klant_id wordt hier wel een foreign key. d.w.z. dat de klant_id een primary key is in een andere tabel die een relatie heeft met de record van deze tabel,

even voor je uitgetekend als voorbeeld:

Afbeelding
Gewijzigd op 09/05/2013 20:16:04 door Reshad F
 
Ozzie PHP

Ozzie PHP

09/05/2013 20:07:54
Quote Anchor link
Oké, volgens mij snap ik het!

"let wel op. klant_id wordt hier wel een foreign key"

Moet ik daar iets voor doen om het als foreign key in te stellen?
 
Reshad F

Reshad F

09/05/2013 20:17:33
Quote Anchor link
Ja dit kan je aangeven. ( ik weet niet hoe je je database beheert ) maar als je phpAdmin o.i.d. gebruikt dan kan je dit makkelijk instellen op de zelfde plek als je bijv een pk instelt.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

09/05/2013 20:17:43
Quote Anchor link
Ja, het doen ;-)
Welke tool gebruik je?
 
Ozzie PHP

Ozzie PHP

09/05/2013 20:22:21
Quote Anchor link
"Ja, het doen ;-)"
Euh.... haha, waar heb jij het over?? :)

Ik gebruik PHPMyAdmin. Hoe moet ik dan zo'n foreign key instellen?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

09/05/2013 20:23:48
Quote Anchor link
Het is overigens geen must, bij een MyISAM tabel kan het niet eens.
Maar altijd wel op zijn minst een index op de kolom (bij een FK gebeurt dat automatisch)
 
Ozzie PHP

Ozzie PHP

09/05/2013 20:26:00
Quote Anchor link
Euh, ja oke... maar hoe moet ik die FK dan instellen? Dat begrijp ik nog niet.
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

09/05/2013 20:29:20
Quote Anchor link
Ik weet niet hoe het met PMA moet maar het kan ook zo:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
ALTER TABLE domains
`    ADD CONSTRAINT fk_domains_cust
        FOREIGN KEY (customer_id)
        REFERENCES customers (customer_id)
            ON DELETE NO ACTION
            ON UPDATE CASCADE

Edit:
De Nederlandse taal kreeg weer een opdonder.
Gewijzigd op 09/05/2013 20:36:01 door Ger van Steenderen
 
Ozzie PHP

Ozzie PHP

09/05/2013 20:34:13
Quote Anchor link
Oké... hier snap ik helemaal niks van :-s

Als ik nu in de tabel met domeinnamen gewoon een veld "klant_id" aanmaak en ik zet daar een index op, is het dan ook goed?

Waarom moet je eigenlijk zo'n FK instellen?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

09/05/2013 20:47:45
Quote Anchor link
Omdat het een zekere consistentie in je database geeft.
a) Je kan geen klant_id in de domein tabel invoeren wat niet bestaat in de klanten tabel.
b) Als je klant een probeert te verwijderen uit de klanten tabel die in de domein tabel voorkomt wordt dat geweigerd (ON DELETE NO ACTION)
c) Als je de id van de klant in de klanten tabel update wordt dit automatisch in de domeinen tabel doorgevoerd (ON UPDATE CASCADE)

Dat laatste is met een AI kolom niet nodig, maar kan ook geen kwaad.
Je kan dus ook ON DELETE CASCADE doen, dan worden alle rijen in de domein tabel die te maken hebben met de klant die je uit de klanten tabel verwijdert, ook verwijderd.
 
Ozzie PHP

Ozzie PHP

09/05/2013 20:57:51
Quote Anchor link
Ah oké... maar doet iedereen het op deze manier? Ik ben niet zo'n expoert in sql en ik zou als ik een klant zou verwijderen dus gewoon code schrijven die controleert of de id voorkomt in de domein tabel. Is dat ook een mogelijkheid? Wat jij dus via SQL doet, zou ik met code doen. Ik ben niet zo thuis in SQL en wat jij doet lijkt me erg ingewikkeld.

Maar kan het wel als ik gewoon een veld "klant_id" toevoeg zonder jouw code te gebruiken? En zo ja, is het dan zinvol om op dat veld een index te zetten?

(sorry voor de vele vragen maar dit is een beetje nieuw voor mij)
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

09/05/2013 21:24:15
Quote Anchor link
Nee, niet iedereen doet het zo, ik zei ook al dat het geen must is.
Het wordt wel vaker gewoon, zoals jij wilt, in de applicatie gedaan, zeker bij grotere databases, want zo'n FK heeft tot gevolg dat mysql eerst gaat controleren welke restricties er bestaan.

Een index op een kolom waarop je straks moet joinen is zeker zinvol, sterker nog het is zeer onverstandig om het niet te doen, dan krijg je namelijk full table scans in een query.
 

Pagina: 1 2 3 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.