Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[MySQL] Many-to-one relatie met mogelijkheid van "any"

Pagina: 1
Acties:

  • NickThissen
  • Registratie: November 2007
  • Laatst online: 18-11 13:07
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!

Mijn iRacing profiel


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
NickThissen schreef op zaterdag 20 oktober 2012 @ 18:33:
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?
Daar is de waarde "NULL" voor uitgevonden, als in Undefined. Je kunt dus gewoon je collumn nullable maken, en als een Foto niet bij een groep hoort zet je de reference op NULL

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • NickThissen
  • Registratie: November 2007
  • Laatst online: 18-11 13:07
Vreemd... Dat is het eerste wat ik geprobeerd had, maar de MySQL workbench dinges liet dat niet toe :/ Nu heb ik het weer geprobeerd en werkt het wel. Misschien was er iets anders mis en heb ik de error verkeerd begrepen... Bedankt :)

Mijn iRacing profiel


  • mrwiggs
  • Registratie: December 2004
  • Laatst online: 10:37
NickThissen schreef op zaterdag 20 oktober 2012 @ 19:18:
Vreemd... Dat is het eerste wat ik geprobeerd had, maar de MySQL workbench dinges liet dat niet toe :/ Nu heb ik het weer geprobeerd en werkt het wel. Misschien was er iets anders mis en heb ik de error verkeerd begrepen... Bedankt :)
Wellicht omdat je in WB niet had aangeklikt dat NULL voor het FK-veld is toegestaan (NN stond aangevinkt, moet uit)