sql >> Databasteknik >  >> RDS >> Mysql

Hur lagrar man flera värden i en kolumn där man använder mindre minne?

Om en användare kan ha flera roller är det förmodligen bättre att ha en user_role tabell som lagrar denna information. Det är normaliserat och kommer att vara mycket lättare att fråga.

En tabell som:

user_id | role
--------+-----------------
      1 | Admin
      2 | User
      2 | Admin
      3 | User
      3 | Author

Tillåter dig att fråga efter alla användare med en viss roll, såsom SELECT user_id, user.name FROM user_role JOIN user WHERE role='Admin' istället för att behöva använda stränganalys för att få ut detaljer från en kolumn.

Detta kommer bland annat att gå snabbare, eftersom du kan indexera kolumnerna ordentligt och tar marginellt mer utrymme än någon lösning som lägger in flera värden i en enda kolumn - vilket är motsatsen till vad relationsdatabaser är designade för.

Anledningen till att detta inte bör lagras är att det är ineffektivt, av anledningen DCoder anger i kommentaren till det här svaret . För att kontrollera om en användare har en roll måste varje rad i användartabellen skannas, och sedan måste kolumnen "roller" skannas med strängmatchning - oavsett hur denna åtgärd exponeras, måste RMDBS:n utföra strängoperationer för att analysera innehållet. Detta är mycket dyra operationer och inte alls bra databasdesign.

Om du behöver för att ha en enda kolumn skulle jag starkt föreslå att du inte längre har ett tekniskt problem, utan ett personalhanteringsproblem . Att lägga till ytterligare tabeller till en befintlig databas som är under utveckling borde inte vara svårt. Om detta inte är något du är behörig att göra, förklara varför det extra bordet behövs för rätt person - eftersom munging flera värden i en enda kolumn är en dålig, dålig idé .



  1. Lösning för ORA-00997:olaglig användning av LONG datatyp

  2. Openshift:Hur fjärråtkomst till MySQL?

  3. Problem med att lagra latitud- och longitudvärden i MySQL-databasen

  4. SQL SERVER - Förstå hur MIN(text) fungerar