Tytuł nie ma zbyt wielkiego sensu, ale nie mogłem wymyślić lepszego tytułu dla tego problemu.
Mam następujące tabele
Projektowanie
- ID
- imię
Klienci
- ID
- projekt id
- imię
Płatności
- ID
- id_customer
- data
- suma
Gdy użytkownik wejdzie do systemu, będzie miał dostęp do określonego projektu. Teraz chcę wymienić wszystkie płatności dla tego projektu i powinno to być dość łatwe:
SELECT FROM payments where id_customer in (SELECT id from customers where id_project = 5)
Moje pytanie brzmi: jeśli nie jest lepiej dodać kolumnę id_project do tabeli płatności w ten sposób, zapytania będą łatwiejsze i szybsze.
database-design
normalization
Gabriel Solomon
źródło
źródło
Odpowiedzi:
Wygląda na to, że pytasz, czy denormalizacja ma sens.
Odpowiedź zawsze brzmi „to zależy”, więc oto moja ogólna zasada:
Jeśli ...
następnie pozostań znormalizowany . Tak, denormalizacja jest szybsza, ale oznacza to również, że masz nadmiarowe dane w systemie - dane, które muszą być utrzymywane i synchronizowane. Nie ma już „jednego źródła” dla tych danych, ale wiele źródeł, które mogą się różnić. Z czasem jest to ryzykowne, więc nie powinieneś tego robić, chyba że masz bardzo dobre powody, poparte niektórymi testami porównawczymi.
Denormalizowałbym się tylko wtedy, gdy ...
Połączenia są bardzo szybkie na nowoczesnym sprzęcie, ale nigdy nie są bezpłatne.
źródło
Lepiej byłoby przepisać zapytanie jako:
Chociaż wydaje się to mniej zwięzłe, a dobry planista zapytań zobaczy, co próbujesz zrobić, i uruchomi skorelowane zapytanie podrzędne, gdy powyższe połączenie zostanie połączone, zły planista zapytań może w końcu wykonać skanowanie indeksu
payments.id_customer
(zakładając, że masz odpowiedni indeks ) (lub, co gorsza, skanowanie tabeli) zamiast robić rzeczy w bardziej wydajny sposób. Nawet dobry planista zapytań może nie zobaczyć optymalizacji, jeśli układ tego zapytania jest zawinięty w coś bardziej skomplikowanego. Wyrażenie relacji jako połączenia zamiast pod-zapytania może mieć większą różnicę niż zmiana struktury danych.Jak mówi Jeff, wszelkie denormalizacje powinny być rozważane ostrożnie - może przynieść łatwe zwiększenie wydajności, szczególnie w niektórych celach sprawozdawczych, ale może prowadzić do niespójności z powodu błędów w wspierającej logice biznesowej.
Na marginesie: Oczywiście nie znam twojej firmy, więc mogłem coś przeoczyć, ale twoje relacje przy stole wydają mi się dziwne. Sugerują, że nigdy nie można mieć więcej niż jednego projektu z tym samym klientem, co zwykle nie jest prawdą z mojego doświadczenia, przynajmniej przez długi okres.
lub jeśli jestem mniej znormalizowany (choć wątpię, by to było konieczne):
Oczywiście to wciąż dyskontuje możliwość wspólnego projektu z dwoma klientami ...
źródło
DROP VIEW
+CREATE VIEW
zamiastALTER VIEW
.W niektórych bazach danych istnieje możliwość tworzenia „widoków zmaterializowanych” zamiast złożonych widoków z dużą ilością danych, na podstawie złożonego zapytania. Można tego użyć, aby uniknąć denormalizacji w historycznym systemie aplikacji. Jeśli zdecydujesz się użyć „ Widoki zmaterializowane ”musisz mieć jasny obraz metod odświeżania i ilości miejsca, które zostanie wykorzystane przez widok zmaterializowany ...
źródło