Wpis z mikrobloga

#webdev #bazydanych #sql #postgresql

Mirki mam pytanie, otóż w pewnej bazie danych najważniejsze informacje o użytkownikach, przechowuję w 2 tabelach: users i settings (tu jest klucz obcy do id z users). Tabela users nie ma żadnych wartości NULL, natomiast settings ma większość wartości NULL dopóki użytkownik ich nie uzupełni.

Przy pobieraniu dużej ilości rekordów z users i settings JOINowanie tabeli settings zajmuje dużo czasu. Profesor od baz danych z polibudy powiedział, że on scalił by obie tabelę. Z drugiej jednak strony, jeżeli jakaś kolumna ma puste wartości to powinno się zrobić tabelę pomocniczą dla niej np users_lang (atomizacja itd). Co wy o tym sądzicie? Dodam, że baza będzie bardzo duża w przyszłości.
  • 28
  • Odpowiedz
  • Otrzymuj powiadomienia
    o nowych komentarzach

Przy pobieraniu dużej ilości rekordów z users i settings JOINowanie tabeli settings zajmuje dużo czasu


@Zaszczyk: Joiny to podstawowa funkcjonalnosc przy pobieraniu danych z bazy. Przy takim problemie jak opisales chyba bym sprawdzil czy wszystko ok z joinem w tym przypadku (explain, execution plan, optimizer output).

MySQL przy joinach zwykle tworzy tabele tymczasowa, a jesli ktoras z laczonych tabel zawiera pola typu (o ile pamietam) blob czy text to tabela bedzie utworzona
  • Odpowiedz
czy jest sens łączyć users z settings?


@Zaszczyk: To zalezy :)

Jesli wiedomo ze nic sie w tej sprawie nei zmieni to spokojnie mozesz to trzxymac w jednej tabeli. Ale jesli tak zrobisz a za pol roku ktos powie ze kazdy juzer ma miec nieograniczona liczbe adresow pocztowych to Cie szlag trafi i bedziesz w tym grzebal trzy tygodnie....
  • Odpowiedz
@Zaszczyk: to zależy co Ty chcesz na tym robić. Beda tam czesto zapytania po wielkich zakresach danych, czy bedziesz strzelal po indeksie do jednego usera? Jak jezdzisz po całej tabeli to indeksy Ci wiele nie pomogą bo lecisz i tak full scana.
  • Odpowiedz
@Zaszczyk: dokładnie tak jak @msq: pisze, nulle to w zasadzie nie problem, problem pojawia się wtedy kiedy robisz photo1 photo2 albo email1 email2 email_3, to jest złooooooooooooooo
  • Odpowiedz
@000loki, @msq z explain analyse to ja walcze już od tygodni, trochę to skomplikowane jest, ale są postępy z mojej strony ;) no i właśnie odkryłem, że to JOIN zajmuje najwięcej czasu. Natomiast rekordy w settings i users są w relacji 1 do 1 (i to już od etapu rejestracji użytkownika) i to na 100% się nie zmieni, ponieważ serwis jest już tylko optymalizowany i dopieszczany. Także radzicie to
  • Odpowiedz
co jest złego w trzymaniu wartości dotyczących jednej klasy w jednej tabeli?


@kowad: Jesli jedna z wlasciowosci klasy to wielowymiarowa tablica o nieokreslonej liczbie elementow to co wtedy? Mozne zserializowac i nadal trzymac w jednej kolumnie, tyle ze wyszukiwanie staje sie problematyczne....
  • Odpowiedz
@msq: napisał, że nie jest, i że każdy wiersz (obiekt) będzie miał same pojedyncze pola bez zbiorów, przynajmniej ja tak zrozumiałem.
  • Odpowiedz
napisał, że nie jest, i że każdy wiersz (obiekt) będzie miał same pojedyncze pola bez zbiorów, przynajmniej ja tak zrozumiałem.


@kowad: Moje doswiadczenie mowi mi ze lepiej sie przygotowac na zmiany w przyszlosci :)

Ale oczywiscie kazdy ma prawo do zdobywania wlasnegod doswiadczenia ( ͡° ͜ʖ ͡°)
  • Odpowiedz