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

Jak pobrać wartości ze znormalizowanej struktury MySQL 5.7, które spełniają określone kryteria?

Użyłeś tabeli Jednostka-Atrybut-Wartość do zarejestrowania swoich atrybutów.

To jest przeciwieństwo normalizacji.

Nazwij zasadę normalizacji, która poprowadziła Cię do umieszczenia różnych atrybutów w tej samej kolumnie. Nie możesz, ponieważ to nie jest praktyka normalizacji.

Aby wykonać zapytanie z obecnym projektem EAV, musisz przestawić wynik tak, aby uzyskać coś, jakbyś miał oryginalną tabelę.

SELECT * FROM (
    SELECT 
         a.article_id,
         a.title, 
         MAX(CASE attr_group WHEN 'ref_id' THEN attribute END) AS ref_id,
         MAX(CASE attr_group WHEN 'dial_c_id' THEN attribute END) AS dial_c_id
         -- ...others...
    FROM test.articles_test a
    INNER JOIN attributes attr ON a.article_id = attr.article_id
    GROUP BY a.article_id, a.title) AS pivot
WHERE pivot.ref_id = '127712' 
  AND pivot.dial_c_id = 51 

Chociaż powyższe zapytanie może przynieść pożądany wynik, wydajność będzie straszna. Musi utworzyć tabelę tymczasową dla podzapytania, zawierającą wszystkie dane z obu tabel , a następnie zastosuj klauzulę WHERE do tabeli tymczasowej.

Naprawdę lepiej jest z każdym atrybutem w osobnej kolumnie w oryginalnej tabeli.

Rozumiem, że w przyszłości próbujesz uwzględnić wiele atrybutów. To powszechny problem.

Zobacz moją odpowiedź na Jak zaprojektować tabelę produktów dla wielu rodzajów produktów, gdzie każdy produkt ma wiele parametrów

Ale nie powinieneś nazywać tego „znormalizowanym”, ponieważ tak nie jest. Nie jest nawet zdenormalizowany . To derelacja .

Nie możesz po prostu użyć słów do opisania czegokolwiek, co chcesz — zwłaszcza przeciwieństwa tego, co oznacza słowo. Nie mogę wypuścić powietrza z opony rowerowej i powiedzieć „napompuję ją”.

Skomentowałeś, że próbujesz „skalować” swoją bazę danych. Nie rozumiesz również, co oznacza słowo „skalowalne”. Używając EAV, tworzysz strukturę, w której potrzebne zapytania są trudne do napisania i nieefektywne do wykonania, a dane zajmują 10x miejsca. To przeciwieństwo skalowalności.

Masz na myśli to, że próbujesz stworzyć system, który jest rozszerzalny . Jest to skomplikowane do zaimplementowania w SQL, ale opisuję kilka rozwiązań w innej odpowiedzi na Stack Overflow, z którą się połączyłem. Może Ci się również spodobać moja prezentacja Rozszerzalne modelowanie danych za pomocą MySQL .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL :Gdy nazwa parametru procedury składowanej jest taka sama jak nazwa kolumny tabeli

  2. mysql(i)_real_escape_string, na którym można bezpiecznie polegać?

  3. Grupowanie podobnych wierszy obok siebie w MySQL

  4. Jak obliczyć sumę kolumny w tabeli SQL dla danej daty i zamienić brakujące wartości na te z najbliższej poprzedniej daty?

  5. Importuj duży plik .sql do MySQL