Tak, to okropny pomysł.
Zamiast iść:
SELECT Deal.Name, DealCategory.Name
FROM Deal
INNER JOIN
DealCategories ON Deal.DealID = DealCategories.DealID
INNER JOIN
DealCategory ON DealCategories.DealCategoryID = DealCategory.DealCategoryID
WHERE Deal.DealID = 1234
Teraz musisz iść:
SELECT Deal.ID, Deal.Name, DealCategories
FROM Deal
WHERE Deal.DealID = 1234
Następnie musisz wykonać czynności w kodzie aplikacji, aby podzielić listę przecinków na poszczególne liczby, a następnie osobno przeszukać bazę danych:
SELECT DealCategory.Name
FROM DealCategory
WHERE DealCategory.DealCategoryID IN (<<that list from before>>)
Ten projekt antipattern wynika albo z całkowitego niezrozumienia modelowania relacyjnego (nie musisz bać się tabel. Tabele to twoi znajomi. Używaj ich), albo dziwnie błędnego przekonania, że szybciej jest wziąć listę oddzieloną przecinkami i podzielić ją w kodzie aplikacji niż po to, aby dodać tabelę linków ( nigdy nie jest). Trzecią opcją jest to, że nie są wystarczająco pewni / kompetentni w SQL, aby móc konfigurować klucze obce, ale w takim przypadku nie powinni mieć nic wspólnego z projektowaniem modelu relacyjnego.
SQL Antipatterns (Karwin, 2010) poświęca cały rozdział temu antypatternowi (który nazywa „Jaywalking”), strony 15-23. Ponadto autor opublikował podobne pytanie w SO . Kluczowe punkty, które zauważa (w odniesieniu do tego przykładu) to:
- Zapytanie o wszystkie oferty w określonej kategorii jest dość skomplikowane (najprostszym sposobem rozwiązania tego problemu jest wyrażenie regularne, ale wyrażenie regularne samo w sobie jest problemem).
- Nie można egzekwować integralności referencyjnej bez relacji klucza obcego. Jeśli usuniesz DealCategory nr. 26, następnie w kodzie aplikacji musisz przejrzeć każdą ofertę w poszukiwaniu odniesień do kategorii 26 i usunąć je. Jest to coś, co powinno być obsługiwane w warstwie danych, a konieczność obsługi tego w aplikacji jest bardzo zła .
- Zbiorczy zapytań (
COUNT
, SUM
etc), ponownie, różnią się od „skomplikowane” do „prawie niemożliwe”. Zapytaj programistów, jak uzyskają listę wszystkich kategorii wraz z liczbą ofert w tej kategorii. Przy odpowiednim projekcie są to cztery linie SQL.
- Aktualizacje stają się znacznie trudniejsze (tzn. Masz umowę w pięciu kategoriach, ale chcesz usunąć dwie i dodać trzy inne). To trzy linie SQL z odpowiednim projektem.
- W końcu napotkasz
VARCHAR
ograniczenia długości listy. Chociaż jeśli masz listę oddzieloną przecinkami, która zawiera ponad 4000 znaków, istnieje szansa, że potwór i tak będzie powolny jak diabli.
- Wyciąganie listy z bazy danych, dzielenie jej, a następnie powrót do bazy danych w celu wykonania innego zapytania jest z natury wolniejsze niż jedno zapytanie.
TLDR: Jest to zasadniczo wadliwy projekt, nie skaluje się dobrze, wprowadza dodatkową złożoność nawet najprostszych zapytań, a zaraz po wyjęciu z pudełka spowalnia działanie aplikacji.