Als een gebruiker meerdere rollen kan hebben, is het waarschijnlijk beter om een user_role
. te hebben tabel waarin deze informatie wordt opgeslagen. Het is genormaliseerd en zal veel gemakkelijker te doorzoeken zijn.
Een tabel zoals:
user_id | role
--------+-----------------
1 | Admin
2 | User
2 | Admin
3 | User
3 | Author
Hiermee kunt u alle gebruikers met een bepaalde rol opvragen, zoals SELECT user_id, user.name FROM user_role JOIN user WHERE role='Admin'
in plaats van string-parsing te moeten gebruiken om details uit een kolom te halen.
Dit zal onder andere sneller zijn, omdat u de kolommen op de juiste manier kunt indexeren en iets meer ruimte in beslag zal nemen dan enige oplossing die meerdere waarden in een enkele kolom plaatst - wat in tegenspraak is met waarvoor relationele databases zijn ontworpen.
De reden dat dit niet moet worden opgeslagen, is dat het inefficiënt is, omdat DCoder vermeldt op de commentaar op dit antwoord . Om te controleren of een gebruiker een rol heeft, moet elke rij van de gebruikerstabel worden gescand en vervolgens moet de kolom "rollen" worden gescand met behulp van tekenreeksovereenkomst - ongeacht hoe deze actie wordt weergegeven, de RMDBS moet tekenreeksbewerkingen uitvoeren om de inhoud te ontleden. Dit zijn erg dure operaties en helemaal geen goed database-ontwerp.
Als je nodig om één enkele kolom te hebben, raad ik u sterk aan niet langer een technisch probleem te hebben, maar een personeelsbeheerprobleem . Het toevoegen van extra tabellen aan een bestaande database die in ontwikkeling is, zou niet moeilijk moeten zijn. Als dit niet iets is waartoe u bevoegd bent, leg dan aan de juiste persoon uit waarom de extra tafel nodig is - omdat munging meerdere waarden in een enkele kolom is een slechte, slechte idee .