Ik heb een MySQL database waar gebruikers bestanden kunnen uploaden. Gebruikers kunnen lid zijn van groepen (many-to-many), en in dat geval kan een gebruiker ook bestanden uploaden die bij een bepaalde groep horen (dwz: alleen gebruikers uit die groep kunnen de bestanden zien). Echter moeten gebruikers ook gewoon bestanden kunnen uploaden die niet bij een groep horen maar voor iedereen zichtbaar zijn.
Dit klinkt allemaal heel simpel, maar toch krijg ik het niet netjes voor elkaar in de database. Uiteraard is er een tabel voor 'users', een tabel voor 'groups', en een koppeltabel 'memberships' (userid, groupid). Voor de bestanden ligt het voor de hand een tabel 'files' te maken met kolommen
- userid (gebruiker die het bestand geupload heeft)
- groupid (group waarvoor het bestand bestemd is)
- filename (filename op de schijf)
Dit werkt prima voor het geval bestanden bij een groep horen, maar dit werkt niet als een bestand voor elke groep beschikbaar moet zijn. In dat geval weet ik namelijk niet wat ik voor groupid moet invullen in de files tabel... Omdat er een foreign key constraint op zit naar de groups tabel (many-to-one) kan ik dus niet 0 ofzo invullen, dat pikt hij niet want er is geen group met id 0.
Hoe los ik dit op?
Ik had zelf een paar dingen bedacht, maar overal lijkt het me dat ik gewoon verkeerd bezig ben en dat ik workarounds zit te verzinnen voor een probleem dat ik op een heel andere manier moet oplossen... Misschien heb ik het mis, of zie ik gewoon iets stoms over het hoofd?
Mijn oplossingen:
- Voeg standaard een 'any' group toe (als eerste, id = 1), en gebruik die groep om 'publieke' bestanden aan te linken. Dit vind ik echt niet netjes echter, en omdat dit geen echte groep is moet ik op de website (waar de database mee werkt) elke keer deze groep gaan verbergen (hij mag dan bijv niet in het overzicht van groepen komen, hij mag niet te kiezen zijn als groep filter, gebruikers mogen geen "lid worden" van deze groep (of alle gebruikers zouden standaard lid moeten zijn), etc..)
- Haal de groupid kolom weg uit de files tabel, en gebruik een nieuwe tabel ('groupfiles' bijv) die files koppelt met groepen (dus met kolommen fileid en groupid). Als een fileid in deze tabel voorkomt dan is hij dus gekoppelt aan een groep (in deze structuur zelfs mogelijkerwijs met meerdere groepen, maar dat hoeft niet). Als hij niet voorkomt is hij niet gekoppeld en is het een publiek beschikbaar bestand. Nadeel is hier dan weer dat ik dit weer moet gaan programmeren in de website. Dat is allemaal wel te doen, maar alsnog lijkt het een workaround...
Enig idee? Bedankt!
Dit klinkt allemaal heel simpel, maar toch krijg ik het niet netjes voor elkaar in de database. Uiteraard is er een tabel voor 'users', een tabel voor 'groups', en een koppeltabel 'memberships' (userid, groupid). Voor de bestanden ligt het voor de hand een tabel 'files' te maken met kolommen
- userid (gebruiker die het bestand geupload heeft)
- groupid (group waarvoor het bestand bestemd is)
- filename (filename op de schijf)
Dit werkt prima voor het geval bestanden bij een groep horen, maar dit werkt niet als een bestand voor elke groep beschikbaar moet zijn. In dat geval weet ik namelijk niet wat ik voor groupid moet invullen in de files tabel... Omdat er een foreign key constraint op zit naar de groups tabel (many-to-one) kan ik dus niet 0 ofzo invullen, dat pikt hij niet want er is geen group met id 0.
Hoe los ik dit op?
Ik had zelf een paar dingen bedacht, maar overal lijkt het me dat ik gewoon verkeerd bezig ben en dat ik workarounds zit te verzinnen voor een probleem dat ik op een heel andere manier moet oplossen... Misschien heb ik het mis, of zie ik gewoon iets stoms over het hoofd?
Mijn oplossingen:
- Voeg standaard een 'any' group toe (als eerste, id = 1), en gebruik die groep om 'publieke' bestanden aan te linken. Dit vind ik echt niet netjes echter, en omdat dit geen echte groep is moet ik op de website (waar de database mee werkt) elke keer deze groep gaan verbergen (hij mag dan bijv niet in het overzicht van groepen komen, hij mag niet te kiezen zijn als groep filter, gebruikers mogen geen "lid worden" van deze groep (of alle gebruikers zouden standaard lid moeten zijn), etc..)
- Haal de groupid kolom weg uit de files tabel, en gebruik een nieuwe tabel ('groupfiles' bijv) die files koppelt met groepen (dus met kolommen fileid en groupid). Als een fileid in deze tabel voorkomt dan is hij dus gekoppelt aan een groep (in deze structuur zelfs mogelijkerwijs met meerdere groepen, maar dat hoeft niet). Als hij niet voorkomt is hij niet gekoppeld en is het een publiek beschikbaar bestand. Nadeel is hier dan weer dat ik dit weer moet gaan programmeren in de website. Dat is allemaal wel te doen, maar alsnog lijkt het een workaround...
Enig idee? Bedankt!