database vraag
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:
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?
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
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
In Ozzie's tabel is de domeinnaam een geschikte kandidaat voor de primary key
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:
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:
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:
of zo?
waarbij in situatie 1 "id" de primary key is en in situatie 2 "domein".
Wie weet het antwoord / heeft tips?
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?
"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?
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.
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?)
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:
Gewijzigd op 09/05/2013 20:16:04 door Reshad F
"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?
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.
Welke tool gebruik je?
Euh.... haha, waar heb jij het over?? :)
Ik gebruik PHPMyAdmin. Hoe moet ik dan zo'n foreign key instellen?
Maar altijd wel op zijn minst een index op de kolom (bij een FK gebeurt dat automatisch)
Euh, ja oke... maar hoe moet ik die FK dan instellen? Dat begrijp ik nog niet.
Code (php)
1
2
3
4
5
6
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
` 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
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?
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.
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)
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.