database vraag
Pagina: « vorige 1 2 3 volgende »
Oké. Dankjewel Ger! Dan zet ik er gewoon een normale index op. Dat abracadabra van jou is nog even te hoog gegrepen :) Thanks!
Waarom gebruik je eigenlijk PMA? Jij hebt toch een eigen server?
Workbench bijvoorbeeld werkt veel makkelijker.
Want dan kan je zonder mijn abracadabra simpel een FK op een kolom zetten.
Ik zie hier zojuist een vaag en onduidelijk filmpje...
http://www.youtube.com/watch?v=IdQGFZwP7Xc
En hier nog een link... http://stackoverflow.com/questions/459312/setting-up-foreign-keys-in-phpmyadmin
Blijkbaar kun je wel een foreign key toevoegen maar moet je gebruik maken van inno db tables????? Zegt jou dat iets toevallig?
Ik:
Het is overigens geen must, bij een MyISAM tabel kan het niet eens.
Ja dus. Voor mysql 5 had je alleen MyISAM tables, later zijn er daar een paar engines bij gekomen en InnoDB is meest gebruikte.
Ik zie in PMA dat ik een tabel kan wijzigen naar InnoDb (huidig is MyISAM). Ik weet niet of ik alle tabellen tegelijk kan wijzigen en of ik de default kan instellen op InnoDb.
Maar wat raad jij aan? Om InnoDb te gaan gebruiken? En zo ja, zijn er behalve die foreign key nog meer verschillen tussen MyISAM en InnoDb?
Hier een overzicht van de belangrijkste (standaard?) engines: http://dev.mysql.com/doc/refman/5.1/en/storage-engines.html
En wat is precies het nut van foreign keys? Waar gebruik je die voor?
(voor jullie waarschijnlijk gesneden koek, maar voor mij nog niet helaas...)
Stel bijvoorbeeld in jouw geval dat je een klant hebt. Die klant heeft weer 5 medewerkers, 2 domeinen en 25 pagina's over die domeinen verdeeld. Door het instellen van FKs kan je nu zorgen dat alle gegevens in de medewerkers tabel (elke medewerker dus) en de domeinen tabel verplicht gelinkt moet zijn aan een klant en dat elke pagina verplicht gelinkt moet zijn aan een bestaand domein. Je kan dus geen medewerker aanmaken voor een niet bestaande klant.
Tevens kan de FK ervoor zorgen dat je geen domein kunt verwijderen waar nog een pagina aan gelinkt is, of juist dat die pagina ook verwijderd wordt als het domein verwijderd wordt. Wil je dan bijvoorbeeld een klant verwijderen dan kan dus automatisch ook alles verwijderd worden dat bij die klant hoort.
Je zorgt dus voor consistentie in je data. Dit kan je ook allemaal met de hand doen.... maar dat gaat geheid een keer fout. Door het instellen van FKs weet je zeker dat het niet fout kan gaan.
Dit klinkt wel goed, maar is het moeilijk om die FK's in te stellen? Het voorbeeld van Ger ziet er vrij ingewikkeld uit...
Ik zou je natuurlijk ook kunnen aanraden om naar postgresql te gaan kijken maar ik denk dat je dat sowieso niet gaat kiezen vanwege de iets tragere performance jou kennende.. maar postgres heeft wel veel meer mogelijkheden ingebakken. zo bijvoorbeeld ook standaard ondersteuning voor foreign keys, Ik moet wel zeggen dat ook de syntax iets anders is maar als je het eenmaal door hebt is het heel simpel.
Maar hoe moeilijk is het dan om die FK's in te stellen? En moet ik dan voortaan alle database tabellen op InnoDB zetten, of alleen de tabellen met FK's?
Gewijzigd op 10/05/2013 00:31:37 door Ozzie PHP
Denk niet dat iets moeilijk is. Denk niet dat je iets niet kan. Probeer het in stukken op te splitsen en je zult zien dat het best wel simpel is.
Allereerst een keer de hele query van ger:
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
Nu in stukken:
ALTER TABLE domains - Een alter table is om een database of tabel aan te passen. Bijv. een huidig veld van type wijzigen of een nieuw veld toevoegen. In dit geval passen we een tabel aan en wel de tabel domains.
ADD CONSTRAINT fk_domains_cust - We voegen nu een constraint toe. Dat is vertaald 'dwang', we dwingen een veld om iets te doen (fk in dit geval).
FOREIGN KEY (customer_id) - De constraint is foreign key en deze 'dwang' leggen we op aan de customer_id veld van de tabel.
REFERENCES customer(customer_id) - Een fk linkt 2 velden aan elkaar. Het eerste veld is zojuist op gegeven, namelijk customer_id van de domains tabel. Het tweede veld geven we nu op, het veld customer_id van de tabel customer.
ON DELETE NO ACTION - Nu volgt er wat hij precies moet doen. Stel we verwijderen de customer, terwijl er nog een domain aan hem gelinkt is doen we niks (no Action).
Gewijzigd op 10/05/2013 00:41:32 door Wouter J
"ON DELETE NO ACTION - Nu volgt er wat hij precies moet doen. Stel we verwijderen de customer, terwijl er nog een domain aan hem gelinkt is doen we niks (no Action)."
Dit snap ik even niet. Als de customer verwijderd wordt, zou het domein toch juist mee verwijderd moeten worden?
"Sqlite heeft volgens mij ook fk support. Hoe je dat in kan stellen? Via pma of, wat natuurlijk mooier is, via een query."'
Ik doe het liever via PMA :-))
En wat is dan weer het verschil tussen MySQL en Sqlite? Of misschien kan ik beter vragen... als ik FK's wil gebruiken, wat is dan het beste? MySQL en InnoDB, Sqlite???
>> Als de customer verwijderd wordt, zou het domein toch juist mee verwijderd moeten worden?
Misschien wel, ik kan me ook zo voorstellen dat je een foutmelding wilt weergeven. Maar je zou vast in plaats van NO ACTION iets als CASCADE kunnen invoeren, dan zal het domain ook verwijderd worden. Ik heb van de rest totaal geen ervaring met fk of mysql, dus 'correct me if I'm wrong'
(over databases gesproken... die van phphulp blijft af en toe hangen "too many connections")
Als ik met dbs werk gebruik ik vaak doctrine. Deze doet dit allemaal voor je als je de mapping goed hebt gedaan. Hoe zo'n query eruitziet heb ik dus geen ervaring mee. Als ik het in een query doe gebruik ik vaak gewoon:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
CREATE TABLE domains
(
id INTEGER PRIMARY KEY,
name VARCHAR(255) NOT NULL,
customer_id INTEGER NOT NULL,
FOREIGN KEY(customer_id) REFERENCES customer(id)
);
(
id INTEGER PRIMARY KEY,
name VARCHAR(255) NOT NULL,
customer_id INTEGER NOT NULL,
FOREIGN KEY(customer_id) REFERENCES customer(id)
);
Dit zal gewoon de standaard configuratie voor fk gebruiken. Ik weet niet of dit mogelijk is in mysql
Gewijzigd op 10/05/2013 01:19:30 door Ozzie PHP
Omdat hij dan de standaard regels gebruikt (gooi error als er wat mis is). Een constraint gebruik je als je andere dingen dan dit wilt doen.
Wat moet ik me voorstellen bij die "standaard regels"? Weet jij die zo te noemen of zijn die ergens terug te vinden?
als ik naar jou wensen kijk dan zou ik gaan voor een MySQL database met een InnoDB engine. stel je zou in de toekomst willen switchen dan kan je dat natuurlijk veranderen.
Quote:
Als de customer verwijderd wordt, zou het domein toch juist mee verwijderd moeten worden?
Nee, dit hoeft niet zo te zijn. sterker nog je hebt de mogelijkheid om ipv geen actie uit te voeren, geen cascade te gebruiken ook de mogelijkheid om restrict te gebruiken. hiermee kan je ervoor zorgen dat wanneer een key ergens van een ander tabel afhankelijk is deze niet verwijderd mag/kan worden. Ik denk dat al met al je nu een beetje teveel informatie hebt gekregen voor dit punt. ik wil je adviseren om je database tabellen in kaart te brengen en te normaliseren vervolgens kan je kijken wat het beste nou echt bij jou past. voor hetzelfde geld heb je helemaal geen fk nodig.
Quote:
Omdat hij dan de standaard regels gebruikt (gooi error als er wat mis is). Een constraint gebruik je als je andere dingen dan dit wilt doen.
Ozzie de constraint is belangrijk omdat je hierdoor de integriteit van je database bewaakt, Stel dat jij een klant weggooit die gekoppeld is aan domeinen, facturen en noem maar op. dan zal de database je een melding geven wanneer er iets met de klant gebeurt ( geüpdatet, verwijderd ) dan kan je iets doen als.
ON UPDATE (CASCADE)
ON DELETE (RESTRICT)
want stel je zou dit niet doen dan zou je dus in je database rondspokende facturen en domeinen kunnen krijgen.
Gewijzigd op 10/05/2013 01:53:43 door Reshad F