Door
george mendel
op 25-05-2014 12:05
gewijzigd op 25-05-2014 12:08
2.513 views
ik ben bezig met een project waarbij je een training op meerdere afdelingen en meerdere subafdelingen kan opslaan. sommige afdelingen hebben geen subafdelingen. Wat is de logische manier om een training aan meerdere afdelingen en meerdere subafdelingen te kunnen opslaan?
klopt deze database structuur?
moet ik de afdeling,subafdeling ophalen uit tabel afdeling_subafdeling en dan oplaan in tabel training_afd_subafd of moet ik het halen uit de tabellen afdeling en subafdeling en dan opslaan in training_afd_subafd? graag jullie hulp?
één training, meerdere (sub)afdelingen = one-to-many.
tabel afdelingen:
- id primary index
- training_id index naar de tabel trainingen
- parent_id index naar dezelfde tabel om aan te geven onder welke categorie deze subcategorie valt of anders NULL
- naam naam van de afdeling
tabel training
- id primary index
- description omschrijving van de training
is er geen andere manier dan een parent id te gebruiken? want afdelingen kunnen in de tabel afdeling nog toegevoegd gewijzigd worden!
Frank Nietbelangrijk op 25/05/2014 12:21:22
één training, meerdere (sub)afdelingen = one-to-many.
tabel afdelingen:
- id primary index
- training_id index naar de tabel trainingen
- parent_id index naar dezelfde tabel om aan te geven onder welke categorie deze subcategorie valt of anders NULL
- naam naam van de afdeling
tabel training
- id primary index
- description omschrijving van de training
Ai, niet op die manier een boom gaan opslaan in je database. Dat gaat hardstikke fout op het moment dat je boom meer lagen krijgt dan je vooraf had verwacht. Als je namelijk alle parents wil hebben voor afdeling x, dan moet je in je query voor elke laag een extra self join maken. Als dat aantal dus variabel is dan is het niet meer te doen. Gebruik daarvoor in plaats een nested set.
Inderdaad redelijk ingewikkeld. Is er geen standaard PHP class die het zware werk van je overneemt?
Ik lees tevens dat een update query al gauw een zware opdracht is in dit model. Is het dan niet juist handiger om bij kleinere bomen een simpel model als de mijne aan te houden?
Een php oplossing kan hierin geen oplossing zijn, omdat je dan eerst alle data uit je database moet halen, om vervolgens in php te gaan filteren etc. Als het in de database te zwaar wordt, dan zeker in php ook.
Inserts, updates en deletes kunnen inderdaad redelijk zwaar worden in dit model en dus niet aan te raden voor data waar erg veel mutaties op plaats vinden. Data die echter redelijk statisch is (en bij bedrijfsafdelingen stel ik mij voor dat dat zo is), is het vele malen beter dan het model dat jij gaf. Alleen als je van te voren 100% zeker weet dat er nooit meer lagen in het model komen kan je ervoor kiezen dat model te gebruiken. Dan kan je namelijk van te voren alle queries baseren op het aantal lagen dat je hebt. Zelf kies ik er echter nooit meer voor, simpelweg omdat het nested set model in veel meer opzichten veel bruikbaarder is.