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

MySQL — czy powinienem używać wielokolumnowych kluczy podstawowych w każdej tabeli podrzędnej?

Te dane są znormalizowane

TABLE { FIELDS }
-----------------------------------------------------------------------
building { id, data } 
floor { id, building_id, data }
room {id, floor_id, data }
bed {id, room_id, data }

Ta tabela nie jest (zły pomysł)

TABLE { FIELDS }
-----------------------------------------------------------------------
building { id, data } 
floor { id, building_id, data }
room {id, building_id, floor_id, data }
bed {id, building_id, floor_id, room_id, data }
  1. W pierwszej (dobrej) tabeli nie masz niepotrzebnych zduplikowanych danych.
  2. Wstawki w pierwszej tabeli będą znacznie szybsze.
  3. Pierwsze tabele łatwiej zmieszczą się w pamięci, przyspieszając zapytania.
  4. InnoDB jest zoptymalizowany pod kątem modelu A, a nie modelu B.
  5. Ta ostatnia (nieprawidłowa) tabela zawiera zduplikowane dane, jeśli który nie jest zsynchronizowany, będziesz mieć bałagan. DB A nie może być znacznie trudniejsze do rozsynchronizowania, ponieważ dane są wymienione tylko raz.
  6. Jeśli chcę połączyć dane z budynku, piętra, pokoju i łóżka będę musiał połączyć wszystkie cztery stoły w modelu A i modelu B, jak tu oszczędzasz czas.
  7. InnoDB przechowuje zindeksowane dane we własnym pliku, jeśli select tylko indeksy , same stoły nigdy być dostępnym. Dlaczego więc duplikujesz indeksy? MySQL i tak nigdy nie będzie musiał czytać głównej tabeli.
  8. InnoDB przechowuje PK w każdym indeksie wtórnym , ze złożonym, a tym samym długim PK, spowalniasz każdy wybór, który używa indeksu i zwiększa rozmiar pliku; bez żadnego zysku.
  9. Czy masz poważny problem z prędkością? Jeśli nie, to czy denormalizujesz swoje stoły?
  10. Nawet nie myśl o używaniu MyISAM, który mniej cierpi z powodu tych problemów, nie jest zoptymalizowany pod kątem baz danych z wieloma połączeniami i nie obsługuje integralności referencyjnej ani transakcji i jest słabym dopasowaniem do tego obciążenia.
  11. Używając klucza złożonego, możesz użyć tylko prawej części klucza, tj. nie możesz użyć floor_id w tabeli bed inne niż użycie id+building_id+floor_id , Oznacza to, że być może będziesz musiał użyć znacznie więcej miejsca na klucze niż jest to potrzebne w modelu A. Albo to, albo musisz dodać dodatkowy indeks (który przeciągnie wokół pełnej kopii PK).

W skrócie
Widzę absolutnie zero korzyści i wiele wad w Modelu B, nigdy go nie używaj!



  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 połączyć się z bazą danych MySQL działającą jako kontener w dockerze?

  2. Jak mogę utworzyć pulę połączeń mysql za pomocą narzędzia asadmin na serwerze GlassFish?

  3. Jak prawidłowo wybrać dane z wielu tabel za pomocą złączeń/podzapytań? (PHP-MySQL)

  4. Jak pobrać wyniki jako wielowymiarową tablicę z mySQL i PHP?

  5. ASP.NET Web Forms i MySql Entity Framework:transakcje zagnieżdżone nie są obsługiwane