Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Za dużo tabel; MySQL może używać tylko 61 tabel w połączeniu

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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak przechowywać zdjęcia w bazie danych MySQL

  2. Narzędzie wiersza poleceń do zbiorczego ładowania MySql

  3. Znajdź nakładające się wiersze (data/godzina) w jednej tabeli

  4. Przechowywanie identyfikatorów GUID/UUID MySQL

  5. Limit wierszy wyjaśnij MySQL