Używasz projektu EAV i próbujesz zrekonstruować pojedynczy wiersz ze zmiennej liczby atrybutów. Wskazuje to na jedną z wielu min lądowych, które napotkasz korzystając z projektu EAV:istnieje praktyczny limit liczby złączeń, które możesz wykonać w pojedynczym zapytaniu SQL.
Zwłaszcza w MySQL - jak już zauważyłeś, istnieje sztywny limit. Ale nawet w przypadku innych marek RDBMS istnieje efektywny limit, ponieważ koszt złączeń jest geometryczny w odniesieniu do liczby tabel.
Jeśli używasz EAV, nie próbuj rekonstruować wiersza w SQL tak, jakbyś miał konwencjonalny projekt bazy danych. Zamiast tego pobierz atrybuty jako wiersze posortowane według identyfikatora jednostki. Następnie przetwórz je w kodzie aplikacji. Oznacza to, że nie możesz zrzucić danych w jednym kroku — musisz napisać kod, aby zapętlić wiersze atrybutów i zmienić każdy wiersz danych, zanim będziesz mógł je wyprowadzić.
EAV nie jest wygodnym projektem bazy danych. Korzystanie z niego ma wiele kosztownych wad, a właśnie trafiłeś w jedną z nich.
Zobacz http://www.simple-talk.com/opinion /opinie-elementy/bad-carma/ za wspaniałą historię o tym, jak używanie EAV skazało jedną firmę.
Zobacz też http://en.wikipedia.org/wiki/Inner-platform_effect ponieważ EAV jest przykładem tego antywzorca.
Rozumiem potrzebę obsługi dynamicznego zestawu atrybutów na produkt w katalogu. Ale EAV zabije twoją aplikację. Oto, co robię, aby obsługiwać atrybuty dynamiczne:
-
Zdefiniuj rzeczywistą kolumnę w tabeli podstawowej dla każdego atrybutu, który jest wspólny dla wszystkich typów produktów. Nazwa produktu, cena, ilość w magazynie itp. Ciężko pracuj, aby wyobrazić sobie kanoniczny produkt encji, dzięki czemu w tym zestawie można umieścić jak najwięcej atrybutów.
-
Zdefiniuj jeszcze jedną kolumnę typu
TEXT
dla wszystkich dodatkowych atrybutów każdego danego typu produktu. Zapisz w tej kolumnie jako Serializowany obiekt LOB atrybutów, w dowolnym formacie:XML, JSON, YAML, własny domowy DSL itp.Traktuj to jako pojedynczą kolumnę w zapytaniach SQL. Każde wyszukiwanie, sortowanie lub wyświetlanie, które musisz wykonać w oparciu o te atrybuty, wymaga pobrania całego
TEXT
Blob do aplikacji, zdeserializuj ją i przeanalizuj atrybuty za pomocą kodu aplikacji.