linken tussen twee tafels
ik heb een componisten tafel, met wat gegevens over een componist, naam etc, maar ook een veld abr(eviation). Abbreviation is dus de afkorting van de "publisher" die bladmuziek van deze componist uitgeeft.
Ik heb een tweede tafel, "publisher" waarin opgenomen de details van die publisher, adres etc. Maar wederom het veld abr.
En dus een pagina waarin de details van een geselecteerde componist staan en dus ook de afkorting van de publisher. Die wil ik graag linken met de details van de benoemde "publisher" Kan dat via dat veld "abr"? Ik zie het niet echt,
Misschien een makkie, maar niet voor mij. Vandaar.
Je moet een veld type INT hebben in de tabel componisten, waarin je het id van de publisher opslaat.
Als je het goed gedaan hebt heb je ook een id kolom met auto_increment, deze kun je beter gebruiken voor relaties i.p.v. een afkorting.
Cijfers zijn namelijk beter voor de performance dan letters.
Tables zijn ontstaan vanuit een import uit twee bestaand excell sheets tbv een website (www.pianoquartet.nl) van deze (door de jaren) verzamelde gegevens van een kennis.
Dat zou jammer zijn.
tabel publishers:
`idpub` int(11) NOT NULL AUTO_INCREMENT,
`abbreviation` varchar(255) DEFAULT NULL,
`country` varchar(255) DEFAULT NULL,
`street` varchar(255) DEFAULT NULL,
`postcode` varchar(255) DEFAULT NULL,
`city` varchar(255) DEFAULT NULL,
`address` varchar(255) DEFAULT NULL,
`name` varchar(255) DEFAULT NULL,
`website` varchar(255) DEFAULT NULL,
`email` varchar(255) DEFAULT NULL,
`oddities` varchar(255) DEFAULT NULL,
`phone` varchar(255) DEFAULT NULL,
PRIMARY KEY (`idpub`),
Tabel Composers:
`idcomp` int(11) NOT NULL AUTO_INCREMENT,
`Composer` varchar(255) CHARACTER SET latin1 COLLATE latin1_german2_ci DEFAULT NULL,
`Birth` varchar(255) CHARACTER SET latin1 COLLATE latin1_german2_ci DEFAULT NULL,
`Nationality` varchar(255) DEFAULT NULL,
`Opus` varchar(255) CHARACTER SET latin1 COLLATE latin1_german2_ci DEFAULT NULL,
`Publisher` varchar(255) DEFAULT NULL,
`Oddities` varchar(255) DEFAULT NULL,
`Fname` text,
`Lname` text,
PRIMARY KEY (`idcomp`)
Gewijzigd op 01/01/1970 01:00:00 door Frank Los
Eigenlijk zijn de tabellen dus al gelinkt, maar op een hele slechte manier. Linken doe je normaal gesproken via zogenaamde "foreign keys" en die zijn van het type INT vanwege de snelheid.
Je kunt dit denk ik wel optimaliseren door een nieuw veld type INT aan te maken in de tabel "composers" en vervolgens een query op te stellen waarmee je dat veld vult.
Verder zou ik eerst nog eens naar de datamodel kijken, want je gebruikt nu bijna overal varchar(255) als datatype terwijl dat lang niet overal nodig/juist is.
Enkele voorbeelden:
- composers.birth lijkt me een datum dus dat hoort gewoon in een DATE veld.
- composers.publisher is een foreign key op de publishers tabel. Hier sla je dus het id van de publisher in op.
http://dev.mysql.com/doc/refman/5.0/en/innodb-foreign-key-constraints.html
Moet ik verder een query draaien die er ongeveer als volgt uit ziet:
ALTER TABLE <table identifier>
ADD [ CONSTRAINT <constraint identifier> ]
FOREIGN KEY ( <column expression> {, <column expression>}... )
REFERENCES <table identifier> [ ( <column expression> {, <column expression>}... ) ]
[ ON UPDATE <referential action> ]
[ ON DELETE <referential action> ]
Ik ben een echte newbie in deze materie, dus excuses voor echt onnozel geschrijf,
met dank frank.
klopt het dat het aanbrengen van een foreign key constraint alleen kan in een Innodb table? Moet ik verder een query draaien die er ongeveer als volgt uit ziet:
ALTER TABLE <table identifier>
ADD [ CONSTRAINT <constraint identifier> ]
FOREIGN KEY ( <column expression> {, <column expression>}... )
REFERENCES <table identifier> [ ( <column expression> {, <column expression>}... ) ]
[ ON UPDATE <referential action> ]
[ ON DELETE <referential action> ]
Ik ben een echte newbie in deze materie, dus excuses voor echt onnozel geschrijf,
met dank frank.
Als alternatief zou je de FK constraint ook mbv phpMyAdmin aan brengen...
Gek om een Frank dit soort vragen te zien stellen ;)
Crispijn schreef op 02.11.2007 14:14:
Yup, zeker de vraag over innoDB is grappig.Gek om een Frank dit soort vragen te zien stellen ;)
Maar zoals iedere Frank zal ook deze Frank eerst moeten leren en daar is niks mis mee!
Succes!
Ps. Kijk ook eens naar PostgreSQL, dat is een échte database. ;)