Лоша практика за използване на списъци, разделени със запетая. Можете да прочетете документация относно нормализирането на базата данни.
Списъците, разделени със запетая, имат много практически проблеми :
- Не мога да гарантирам, че всяка стойност е правилният тип данни:няма начин да се предотврати 1,2,3,banana,5
- Не може да се използват ограничения на външния ключ за свързване на стойности към справочна таблица; няма начин за налагане на референтна цялост.
- Не може да се наложи уникалност:няма начин да се предотврати 1,2,3,3,3,5
- Не може да се изтрие стойност от списъка, без да се извлече целия списък.
- Не може да се съхранява списък, по-дълъг от този, който се побира в колоната низ.
- Трудно е да се търсят всички обекти с дадена стойност в списъка; трябва да използвате неефективно сканиране на таблица. Може да се наложи да се прибегне до регулярни изрази, например в MySQL:
idlist REGEXP '[[:<:]]2[[:>:]]'
- Трудно е да се преброят елементи в списъка или да се правят други обобщени заявки.
- Трудно е да се присъединят стойностите към справочната таблица, която препращат.
- Трудно е да се извлече списъкът в сортиран ред.
- Съхраняването на цели числа като низове отнема около два пъти повече място в сравнение с двоични цели числа. Да не говорим за пространството, заето от знаците comma.
Но ако имате нужда от него за всеки случай, можете да използвате нещо подобно:
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
Повече за Списъци, разделени със запетая