database vraag

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: « vorige 1 2 3 volgende »

Ozzie PHP

Ozzie PHP

09/05/2013 21:32:12
Quote Anchor link
Oké. Dankjewel Ger! Dan zet ik er gewoon een normale index op. Dat abracadabra van jou is nog even te hoog gegrepen :) Thanks!
 
PHP hulp

PHP hulp

17/11/2024 23:47:45
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

09/05/2013 21:40:19
Quote Anchor link
Geen dank.

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.
 
Ozzie PHP

Ozzie PHP

09/05/2013 21:55:45
Quote Anchor link
Oh, ik heb eerlijk gezegd geen idee hoe dat werkt en hoe ik dat moet installeren. Ik heb voor het eerst een server... en het hangt er ook vanaf of ik er uiteindelijk mee door ga ja of nee. In het verleden heb ik wel met PMA gewerkt, dus vandaar dat ik het ken. Eigenlijk dus pure gewenning...

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?
 
Ger van Steenderen
Tutorial mod

Ger van Steenderen

09/05/2013 22:10:43
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

09/05/2013 22:24:35
Quote Anchor link
Maar ik heb dus die innodb nodig om een foreign key in te kunnen stellen?

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?
 
Erwin H

Erwin H

09/05/2013 22:44:38
Quote Anchor link
Storage engine hang af van wat je nodig hebt. InnoDB is de enige standaard engine in MySQL die foreign keys ondersteunt, dus als je een FK nodig hebt zal je die moeten gebruiken. Andere engines hebben weer andere voordelen.

Hier een overzicht van de belangrijkste (standaard?) engines: http://dev.mysql.com/doc/refman/5.1/en/storage-engines.html
 
Ozzie PHP

Ozzie PHP

09/05/2013 22:57:12
Quote Anchor link
Laat ik mijn vraag anders stellen... ik heb niet echt heel veel verstand van MySQL en ken alleen de basis-dingen. Welke storage engine wordt het meest gebruikt. MyISAM of InnoDB?

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...)
 
Erwin H

Erwin H

09/05/2013 23:21:06
Quote Anchor link
Ger heeft vast een nog veel beter antwoord, maar even puur functioneel gezien is een FK vooral bruikbaar voor het bewaken van de integriteit van je tabellen. Door middel van het (goed) instellen van FKs kan je ervoor zorgen data over tabellen heen aan elkaar gelinkt is.

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.
 
Ozzie PHP

Ozzie PHP

10/05/2013 00:21:32
Quote Anchor link
Dit klinkt wel goed, maar is het moeilijk om die FK's in te stellen? Het voorbeeld van Ger ziet er vrij ingewikkeld uit...
 
Reshad F

Reshad F

10/05/2013 00:27:06
Quote Anchor link
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.
 
Ozzie PHP

Ozzie PHP

10/05/2013 00:31:18
Quote Anchor link
Laten we het voorlopig maar bij MySQL houden ;)

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
 
Wouter J

Wouter J

10/05/2013 00:40:48
Quote Anchor link
Sqlite heeft volgens mij ook fk support. Hoe je dat in kan stellen? Via pma of, wat natuurlijk mooier is, via een query.

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)
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


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
 
Ozzie PHP

Ozzie PHP

10/05/2013 00:46:42
Quote Anchor link
Thanks Wouter. Dat maakt het al een stuk helderder!

"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???
 
Wouter J

Wouter J

10/05/2013 00:58:57
Quote Anchor link
InnoDB is een engine en MySQL en sqlite zijn beide providers. MySQL gebruikt een server voor zijn tabellen, terwijl sqlite een bestand gebruikt voor zijn tabellen. Binnen MySQL heb je verschillende engines. InnoDB is daar 1 van.

>> 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'
 
Ozzie PHP

Ozzie PHP

10/05/2013 01:05:18
Quote Anchor link
Ah oké... dat je er geen ervaring mee hebt, moet ik daaruit ook afleiden dat jij zelf geen FK's gebruikt? En hoe koppel jij dan primary keys met foreign keys? En welke engine en welke provider gebruik jij dan?

(over databases gesproken... die van phphulp blijft af en toe hangen "too many connections")
 
Wouter J

Wouter J

10/05/2013 01:14:24
Quote Anchor link
Ik gebruik vaak sqlite, omdat ik dan geen localhost hoef op te starten en gewoon met de ingebouwde php server aan de slag kan.

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)
PHP script in nieuw venster Selecteer het PHP script
1
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)
);


Dit zal gewoon de standaard configuratie voor fk gebruiken. Ik weet niet of dit mogelijk is in mysql
 
Ozzie PHP

Ozzie PHP

10/05/2013 01:19:00
Quote Anchor link
Oké, thanks! Maar waarom set jij dan een FK als je er geen "regels" aan verbindt?
Gewijzigd op 10/05/2013 01:19:30 door Ozzie PHP
 
Wouter J

Wouter J

10/05/2013 01:42:14
Quote Anchor link
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 PHP

Ozzie PHP

10/05/2013 01:46:39
Quote Anchor link
Ah oké... ik leer steeds meer bij :)
Wat moet ik me voorstellen bij die "standaard regels"? Weet jij die zo te noemen of zijn die ergens terug te vinden?
 
Reshad F

Reshad F

10/05/2013 01:47:22
Quote Anchor link
Ozzie je hebt geen "beste" als het gaat om een Database maar het is meer wat is jou wens?

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
 

Pagina: « vorige 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.