Zła praktyka używania list rozdzielanych przecinkami. Możesz przeczytać dokumentację o normalizacji bazy danych.
Listy oddzielone przecinkami mają wiele praktycznych problemów :
- Nie mogę zapewnić, że każda wartość jest właściwym typem danych:nie ma sposobu, aby zapobiec 1,2,3,bananowi,5
- Nie można używać ograniczeń klucza obcego do łączenia wartości z tabelą przeglądową; nie ma sposobu na wymuszenie integralności referencyjnej.
- Nie można wymusić unikalności:nie ma sposobu, aby zapobiec 1,2,3,3,3,5
- Nie można usunąć wartości z listy bez pobrania całej listy.
- Nie można przechowywać listy dłuższej niż ta, która mieści się w kolumnie ciągu.
- Trudno wyszukać wszystkie podmioty o podanej wartości na liście; musisz użyć nieefektywnego skanowania tabeli. Może być konieczne uciekanie się do wyrażeń regularnych, na przykład w MySQL:
idlist REGEXP '[[:<:]]2[[:>:]]'
- Trudno policzyć elementy na liście lub wykonać inne zapytania zbiorcze.
- Trudno połączyć wartości z tabelą przeglądową, do której się odnoszą.
- Trudno pobrać listę w kolejności posortowanej.
- Przechowywanie liczb całkowitych jako łańcuchów zajmuje około dwa razy więcej miejsca niż przechowywanie binarnych liczb całkowitych. Nie wspominając o miejscu zajmowanym przez przecinki.
Ale jeśli potrzebujesz tego w każdym przypadku, możesz użyć czegoś takiego:
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
Więcej informacji o Listy oddzielone przecinkami