Tak naprawdę nie ma dobrej odpowiedzi na to pytanie. Dla każdej decyzji robimy nową tabelę czy też nie trzeba wziąć pod uwagę czy plusy przeważają nad minusami
Przykładowo możesz mieć bazę dla jakiejś gry online. Informacje takie jak dane użytkownika, postacie, tranzakcje pieniężne raczej chcesz trzymać w sposób znormalizowany, bo te informacje są często aktualizowane/odpytywane przez różne miejsca w systemie. Z drugiej strony zapisy (jaka jest postać w danej sesji, ile ma życia, jakie przedmioty) mogą być lepsze w postaci 0NF w formie jakiegoś dokumentu np. JSONa
Z zalet takiego podejścia:
- aplikacja wcale nie chce czytać/aktualizować konkretne pole z zapisu. Dużo prościej wszystko wczytać i zapisać za każdym razem. Dodanie nowego pola to może być po prostu nowa linia w aplikacji bez ruszania schematu bazy.
- takie zapisy mogą mocno ewoulować. Przykładowo w jednej wersji postać ma tylko punkty życia a w kolejnej dodałeś manę. Baza danych nie ma dobrej wiedzy
jaka powinna być ilość punktów mana dla postaci z wersji gry, która jeszcze nie miała magii. Zamiast tego możesz w bazie trzymać wersję zapisu np. "version: "1.0" a kod w aplikacji będzie wiedział jak go zmigrować do nowej wersji np. o ta postać ma rasę czarującą to jej damy dużo many
- co tyczy się poprzedniego punktu: utrzymywanie złożonego modelu bazy jest upierdliwe. Migracje są często stresujące i mogą zablokować całą bazę. Jeżeli nie dbasz o zalety normalizacji (redundacja, łatwe odpytanie/aktualizacja konkretnej wartości z bloba) to uproszczony model może być lepszy
Tak naprawdę to nie ma lepszej metody niż spróbowania kilku podejść i wybranie, która się nam bardziej podoba. Warto sobie wyobraźić jakiego rodzaju zapytania/zapisy będą dotykały bazy i czy konkretny model bazy jest do tego dobrze dostosowany
Ok, tyle, że na ile np zastosowanie modelu 3NF przy dodawaniu książki do bazy gdzie mamy podział nawet na 3 tabelki będzie ew szybszy od 1NF i upchania wszystkiego w jednym skoro w tym I wszystkim który wymieniłem obiekt będzie w tabelce z identyfikatorem.
Jak nie projektujesz w jakiejś ogromnej skali to się tym nie przejmuj. Rób tak, żeby dobrze się tego używał a nie, żeby było szybko.
W przypadku wydajności nie ma dobrej odpowiedzi. Poczytaj jak działa MVCC w bazach danych. Taki postgres o ile dobrze wiem to zazwyczaj kopiuje cały wiersz przy aktualizacji co oznacza, że dla tabel z dużymi polami/dużą ilością pól brak normalizacji może sprawić, że marnujesz procesor i storage na kopiowaniu wszystkiego. Z drugiej strony dodanie jednego wiersza, którego nigdy nie będziesz modyfikował będzie raczej szybsze niż 20 nowych wierszy rozbitych na różne tabele