Dålig praxis att använda kommaseparerade listor. Du kan läsa dokumentation om databasnormalisering.
Kommaseparerade listor har många praktiska problem :
- Kan inte säkerställa att varje värde är rätt datatyp:inget sätt att förhindra 1,2,3,banan,5
- Kan inte använda begränsningar för främmande nyckel för att länka värden till en uppslagstabell; inget sätt att framtvinga referensintegritet.
- Kan inte framtvinga unikhet:inget sätt att förhindra 1,2,3,3,3,5
- Det går inte att ta bort ett värde från listan utan att hämta hela listan.
- Kan inte lagra en lista längre än vad som får plats i strängkolumnen.
- Svårt att söka efter alla enheter med ett givet värde i listan; du måste använda en ineffektiv tabellskanning. Kan behöva tillgripa reguljära uttryck, till exempel i MySQL:
idlist REGEXP '[[:<:]]2[[:>:]]'
- Svårt att räkna element i listan, eller göra andra sammanställda frågor.
- Svårt att koppla samman värdena till uppslagstabellen de refererar till.
- Svårt att hämta listan i sorterad ordning.
- Att lagra heltal som strängar tar ungefär dubbelt så mycket utrymme för att lagra binära heltal. För att inte tala om utrymmet som commacharaktörerna tar.
Men om du behöver det i vilket fall som helst, kan du använda något liknande:
SELECT FilmID,
FilmName,
Id = REPLACE(
(
SELECT DateShown AS [data()]
FROM YourTable
WHERE FilmID = a.FilmID
ORDER BY FilmName FOR XML PATH('')), ' ', ','
)
FROM YourTable a
WHERE FilmName IS NOT NULL
GROUP BY FilmID, FilmName
Mer om Kommaseparerade listor