JavaRush /Blog Java /Random-PL /Wywiad z programistą: analiza pytań do bazy danych

Wywiad z programistą: analiza pytań do bazy danych

Opublikowano w grupie Random-PL
Cześć wszystkim! Wszyscy tutaj pracujemy nad jednym celem — zostać programistami Java . Być może najważniejszym etapem na drodze do zostania profesjonalistą jest rozmowa techniczna. Z reguły ankieter omawia główne tematy, zadając kilka pytań. W tym artykule porozmawiamy o jednym z takich kluczowych tematów – bazach danych . Przyjrzyjmy się najczęściej zadawanym pytaniom i spróbujmy odpowiedzieć na nie bez zagłębiania się w materiał, bo w tym przypadku objętość książki będzie dla nas niewystarczająca! Więc chodźmy.Wywiad z programistą: analiza pytań do bazy danych - 1

1. Czym są bazy danych? Na jakie typy się je dzieli?

Co oznacza DBMS?

Wywiad z programistą: analiza pytań do bazy danych - 2Baza danych (DB) to zorganizowana struktura przeznaczona do przechowywania, zmiany i przetwarzania powiązanych ze sobą informacji, głównie o dużych wolumenach. Innymi słowy, baza danych to ustrukturyzowany magazyn danych. Na przykład książka telefoniczna.

Typy baz danych

  1. Relacyjna baza danych to zbiór danych z predefiniowanymi relacjami między nimi. Dane są przechowywane w postaci zestawu tabel składających się z kolumn i wierszy. Tabele przechowują informacje o obiektach reprezentowanych w bazie danych. Każda kolumna tabeli przechowuje określony typ danych, a każda komórka przechowuje wartość atrybutu.
  2. Systemy nierelacyjne (NoSQL) to systemy zaprojektowane dla określonych modeli danych z elastycznymi schematami. Innymi słowy, są to bazy danych przechowujące dane nie w formie schematów tabelarycznych, wierszy i kolumn, ale w innych formatach.
Więcej o nierelacyjnych bazach danych możesz przeczytać w tym artykule: Przewodnik po NoSQL dla programistów . System zarządzania bazami danych (SZBD) to zestaw oprogramowania, za pomocą którego użytkownik może tworzyć bazy danych (DB) i wykonywać na nich różne operacje: uzupełnianie, aktualizowanie, usuwanie, wybieranie itp. SZBD gwarantuje bezpieczeństwo, integralność, bezpieczeństwo danych przechowywania danych oraz umożliwia nadanie dostępu do administrowania bazą danych. Na przykład MySql to system DBMS zapewniający dostęp do relacyjnej bazy danych lub MongoDB w przypadku bazy nierelacyjnej.

2. Czym jest normalizacja? Znormalizowana forma? Ile jest form normalizacji? Wymień pierwsze trzy.

Normalizacja to proces organizowania i strukturyzacji danych w bazie danych, który zapewnia większą elastyczność bazy danych poprzez eliminację nadmiarowości i niespójności zależności. Forma normalna to właściwość tabeli rozpatrywana w kontekście normalizacji, która charakteryzuje tabelę pod względem prostoty i poprawności konstrukcji. Postać normalną definiuje się jako zbiór wymagań, które musi spełniać tabela. W sumie istnieje sześć form normalnych, ale w praktyce używa się nie więcej niż pierwszych trzech:
  1. Pierwsza postać normalna:
    • Wszystkie atrybuty są proste (to znaczy atomowe i niepodzielne);
    • Wszystkie dane są skalarne (to znaczy dodatnie);
    • Nie ma zduplikowanych wierszy (w tym celu dla każdego wiersza tworzony jest klucz podstawowy).
  2. Druga postać normalna:
    • Spełnione są warunki pierwszej postaci normalnej;
    • Każdy atrybut inny niż klucz odwołuje się do klucza podstawowego.
  3. Trzecia postać normalna:
    • Warunki drugiej grupy normalnej są spełnione;
    • Pola niekluczowe są niezależne od innych pól niekluczowych: można je powiązać jedynie z kluczem podstawowym.

3. Denormalizacja

Denormalizacja to celowe ograniczenie lub naruszenie form normalizacji bazy danych, zwykle w celu przyspieszenia odczytu z bazy danych poprzez dodanie zbędnych danych. Ogólnie rzecz biorąc, jest to proces odwrotny do normalizacji. Dzieje się tak, ponieważ teoria form normalnych nie zawsze ma zastosowanie w praktyce. Na przykład wartości nieatomowe nie zawsze są „złe”: czasami nawet odwrotnie. W niektórych przypadkach podczas wykonywania zapytań konieczne są dodatkowe sprzężenia, szczególnie przy przetwarzaniu dużej ilości informacji. Może to ostatecznie poprawić wydajność. Bazy danych przeznaczone do celów analitycznych są często denormalizowane w celu przyspieszenia wykonywania zapytań. Na przykład często będziesz próbkować niektóre dane do raportów, w których kolumny inne niż kluczowe będą ze sobą powiązane. Celowo usuwasz trzecią formę normalizacji i łączysz wszystko w jedną tabelę, aby ułatwić próbkowanie - dzięki czemu nie musisz wykonywać dodatkowych zapytań do innych tabel.

4. Indeksy

Indeks to posortowany zbiór wartości powiązany z tabelą lub widokiem z konkretną kolumną, który przyspiesza wyszukiwanie danych. Czyli jest to swego rodzaju indeks: jak alfabet w książce telefonicznej, który pomaga nam przy wyszukiwaniu po nazwisku. Jeśli ta funkcja zostanie prawidłowo użyta, może znacznie poprawić wydajność podczas pracy z dużymi bazami danych. Lub możesz znacznie obniżyć. Aby przyspieszyć wyszukiwanie, klucze te są przechowywane w zrównoważonej strukturze drzewa, poprzez którą przeprowadzane jest wyszukiwanie. Z reguły indeksy należy wpisać w polach, które są najczęściej przeszukiwane. O utworzeniu indeksu warto pomyśleć nie wcześniej niż w przypadku posiadania co najmniej 10 tys. rekordów. W przeciwnym razie nie zobaczysz zauważalnego rezultatu, ponieważ przedwczesna optymalizacja to ZŁO . A w jaki sposób indeks może wpłynąć na wydajność systemu, pytasz? Po wstawieniu nowych danych lub usunięciu starych danych zrównoważona struktura drzewa zostanie ponownie obliczona. Właściwie im więcej danych i indeksów, tym więcej drzew należy policzyć. Wyobraź sobie sytuację: masz na tej tabeli około 20 000 rekordów i 7 indeksów. Oznacza to, że podczas wstawiania danych należy przeliczyć 7 drzew, każde po 20 000 rekordów. Ściśle mówiąc, nie zaleca się stosowania indeksów dla tabel, do których dane będą często dodawane/usuwane. Na koniec zaznaczę, że indeksy dla kolumn, w których często znajduje się wartość, nullnie będą już tak efektywne, dlatego nie warto ich dodawać do takich kolumn.

Jaka jest różnica między indeksami klastrowymi i nieklastrowymi w SQL?

Klastrowane:

  • Zapewnia porządek fizyczny dla wybranego pola;
  • Jeśli tabela ma indeks klastrowy, nazywa się ją klastrową;
  • Nie jest potrzebny więcej niż jeden indeks na tabelę;
  • W MySQL indeks klastrowy nie jest jawnie określony przez użytkownika, ponieważ jeśli nie zdefiniujesz KLUCZ PODSTAWOWY w tabeli, MySQL znajdzie pierwszy indeks, UNIQUEw którym znajdują się wszystkie kolumny kluczy NOT NULL, a InnoDB użyje go jako indeksu klastrowego.

Nieklastrowane:

  • W jednej tabeli można umieścić do 999 indeksów nieklastrowych;
  • Zawiera wskaźnik do wierszy z rzeczywistymi danymi w tabeli;
  • Nie zapewnia porządku fizycznego;
  • Dla indeksów nieklastrowanych przewidziano osobne tabele z posortowanymi danymi, czyli jedna tabela na jedną kolumnę, na której znajduje się indeks, zatem w przypadku żądania danych nie wchodzących w skład danego pola, zapytanie zostanie najpierw wykonane na pole w tej tabeli, a dopiero potem dodatkowe zapytanie o wiersz w oryginalnej tabeli.
Tworzenie indeksu nieklastrowanego:
CREATE INDEX index_name ON table_name(column_name)

6. Co to jest indeks złożony?

Indeks złożony - zbudowany z wysyłaniem do kilku kolumn jednocześnie. Innymi słowy jest to złożony indeks składający się z kilku kolumn. Takie indeksy stosuje się, gdy w jednym zapytaniu pojawia się więcej niż jedna kolumna. Tworzenie indeksu złożonego:
CREATE INDEX index_name ON table_name(first_column_name, second_column_name, third_column_name)
Zwykle te indeksy są używane, gdy dane w wielu kolumnach są logicznie powiązane.

7. Co to jest indeks kryjący? Unikalny indeks?

Indeks pokrywający to indeks wystarczający do udzielenia odpowiedzi na zapytanie bez dostępu do samej tabeli. Za pomocą tego indeksu można uzyskać cały wiersz danych, ale w rzeczywistości nie jest to po prostu konieczne. Ponieważ nie musisz przechodzić bezpośrednio do tabeli źródłowej i możesz odpowiedzieć, używając samego indeksu, użycie indeksów obejmujących jest nieco szybsze. Jednocześnie nie zapominaj, że im więcej kolumn, tym bardziej uciążliwy i powolny staje się sam indeks. Nie powinieneś więc tego nadużywać. Powyżej mówiliśmy o indeksach klastrowych i nieklastrowych, które mogą być unikalne . Oznacza to, że żadne dwa pola nie mają tej samej wartości klucza indeksu. W przeciwnym razie indeks nie będzie unikalny, ponieważ kilka wierszy może zawierać tę samą wartość. Przykład tworzenia unikalnego indeksu nieklastrowanego:
CREATE UNIQUE INDEX index_name ON table_name(column_name)

8. Co to jest klucz podstawowy

Klucz podstawowy to pole w tabeli, które identyfikuje każdy wiersz w tabeli bazy danych. W tabeli może znajdować się tylko jedno takie pole, a wszystkie wartości muszą być unikalne. Nic Ci nie przypomniało? Wywiad z programistą: analiza pytań do bazy danych - 3W końcu klucz podstawowy to nic innego jak unikalny indeks klastrowy. Z reguły klucze podstawowe są tworzone podczas tworzenia tabeli:
CREATE TABLE table_name(
column_name int PRIMARY KEY,..)
Do tej kolumny automatycznie zostanie dodane ograniczenie - NOT NULL. Możesz także ustawić klucz dla już utworzonej tabeli:
ALTER TABLE table_name ADD PRIMARY KEY (column_name);
W przypadku dodania klucza podstawowego w sposób opisany powyżej, wówczas sprawdzane są wartości pól określonych jako klucz podstawowy ( column_name), aby upewnić się, że nie zawierają one wartości null (dodane zostanie również ograniczenie - NOT NULL).

Co to jest klucz obcy?

Klucz obcy to właściwość utworzona w celu zapewnienia relacji między tabelami. Zwykle klucz obcy jest ustawiony na kolumnach podtabeli i wskazuje jedną z kolumn tabeli głównej. Można określić tak jak przy tworzeniu tabeli:
CREATE TABLE table_name{
column_name int,..
FOREIGN KEY(column_name) REFERENCES another_table_name(another_table_column_name) }
Zatem po utworzeniu tabeli:
ALTER TABLE table_name
ADD FOREIGN KEY(column_name) REFERENCES another_table_name(another_table_column_name));
Możesz ustawić zachowanie klucza obcego podczas manipulacji polem, do którego się odnosi. Manipulacje mogą być następujących ON DELETEtypów ON UPDATE: Możliwe opcje zachowania:
  • CASCADE— dzięki tej właściwości wiersze z tabeli zależnej będą automatycznie usuwane lub zmieniane w przypadku usunięcia lub zmiany powiązanych wierszy w tabeli głównej;
  • SET NULL— dzięki tej właściwości, w przypadku usunięcia lub aktualizacji powiązanego wiersza z tabeli głównej, NULLzostanie ustawiona wartość dla kolumny klucza obcego;
  • NO ACTION— odrzuca próby usunięcia lub zmiany wierszy w tabeli głównej, jeżeli w tabeli zależnej istnieją powiązane wiersze;
  • RESTRICT- równoważny NO ACTION;
  • SET DEFAULT- dzięki tej właściwości, gdy powiązany wiersz zostanie usunięty lub zaktualizowany z głównej tabeli, zostanie ustawiona wartość domyślna (jeśli istnieje) dla kolumny klucza obcego.
Przykład użycia:
CREATE TABLE table_name{
column_name int,..
FOREIGN KEY(column_name) REFERENCES another_table_name(another_table_column_name) ON UPDATE CASCADE ON DELETE CASCADE }
ON DELETEJeśli zachowanie dla i nie jest jawnie ustawione ON UPDATE, zachowanie zostanie ustawione na RESTRICT.

10. Rodzaje połączeń między tabelami (Join)

Połączenie pomiędzy tabelami realizowane jest w oparciu o wspólne dane (pola). Dzieje się to za pomocą operatora JOIN— operacji dopasowującej wiersze z jednej tabeli do wierszy w drugiej. Mapowanie odbywa się tak, że kolumny obu tabel sąsiadują ze sobą, chociaż można je uzyskać z oddzielnych tabel. A jeśli mamy wspólne pola dla trzech tabel, możemy wyświetlić ich dane jako jedną wspólną tabelę. Warto jednak wziąć pod uwagę, że im mniej połączonych tabel, tym szybciej będzie wykonywane zapytanie. A więc typy JOIN:
  • INNER JOIN- połączenie pokazujące tylko te dane z pierwszej tabeli, które odpowiadają niektórym danym z drugiej tabeli. Reszta spada.Wywiad z programistą: analiza pytań do bazy danych - 4
  • LEFT JOIN- połączenie pokazujące wszystkie dane z pierwszej tabeli i odpowiadające im dane z drugiej, jeśli takie istnieją. Jeżeli nie ma odpowiednich danych, pola na dane z drugiej tabeli będą puste.Wywiad z programistą: analiza pytań do bazy danych - 5
  • RIGHT JOIN- połączenie pokazujące wszystkie dane z drugiej tabeli i odpowiadające im dane z pierwszej, jeśli takie istnieją. Jeżeli nie ma odpowiednich danych, pola dla danych z pierwszej tabeli będą puste.Wywiad z programistą: analiza pytań do bazy danych - 6
  • FULL JOIN- połączenie pokazujące wszystkie dane z pierwszej i drugiej tabeli. Jeśli w drugiej tabeli nie ma powiązanych danych, pola tych danych będą puste.Wywiad z programistą: analiza pytań do bazy danych - 7
  • CROSS JOIN- złączenie krzyżowe, w którym każdy wiersz pierwszej tabeli jest łączony z każdym wierszem drugiej tabeli (każdy do każdego). Oznacza to, że jeśli dwie tabele mają po 3 wiersze każda, po tym połączeniu otrzymamy wynik 9 wierszy.Wywiad z programistą: analiza pytań do bazy danych - 8
Przykład Join(inner):
SELECT *
FROM first_table
INNER JOIN second_table ON first_table.some_column = second_table.some_column

11. Co to jest właściwość ACID w bazie danych?

A - Atomowość zapewnia, że ​​żadna transakcja nie zostanie częściowo zatwierdzona w systemie. Albo wykonywane są wszystkie jego podoperacje, albo żadna. Na przykład przelew pieniędzy z banku na inne konto obejmuje dwie operacje:
  1. Przelej pieniądze na konto bankowe.
  2. Przelej pieniądze z konta bankowego na konkretne konto.
Ale wszystko może się zdarzyć. Pójdą np. do banku, po czym pojawi się jakiś błąd i druga operacja nie zostanie zrealizowana. Lub odwrotnie: zostanie wykonana tylko druga operacja. Działania te realizowane są więc w ramach jednej transakcji, a efektem jest albo wszystko, albo nic. C – Spójność : każda udana transakcja zawsze rejestruje tylko możliwe do rozwiązania wyniki. Zapewnia to spełnienie wszystkich ograniczeń (na przykład NOT NULL), w przeciwnym razie transakcja zostanie wycofana. Oraz - izolacja : podczas realizacji transakcji transakcje równoległe nie powinny mieć wpływu na jej wynik. Daje nam to możliwość ukrycia przed wszystkimi nieostatecznych stanów danych. Właściwie dlatego nieudane transakcje nie mogą niczego zepsuć. Nieco niżej zapoznamy się z poziomami izolacji transakcji. D - Trwałość : Jeśli transakcja zostanie zakończona, możesz być pewien, że wprowadzone w niej zmiany nie zostaną anulowane z powodu jakiejś awarii.

12. Poziomy izolacji transakcji

Każdy poziom izolacji pozwala/zabrania pewnych działań (możliwości):
  • odczyt fantomowy - w ramach tej samej transakcji to samo żądanie danych daje różne wyniki, co następuje na skutek dodania danych przez inną (równoległą) transakcję.
  • odczyt jednorazowy - w ramach tej samej transakcji to samo żądanie danych daje różne wyniki, co następuje na skutek zmiany lub usunięcia danych przez inną (równoległą) transakcję.
  • odczyt "brudny" - odczytanie danych dodanych lub zmienionych w wyniku transakcji, które nie zostaną później wycofane;
  • utracona aktualizacja - gdy różne transakcje zmieniają ten sam blok danych w tym samym czasie, wszystkie zmiany oprócz ostatniej zostają utracone (podobnie jak w przypadku „warunków wyścigu” w wielowątkowości).
Dla wygody rozważamy poziomy izolacji i ich możliwości w tabeli:
Poziomy izolacji Czytanie fantomowe Niepowtarzalne czytanie „brudna” lektura utracona aktualizacja
SERIALIZOWALNE + + + +
REPEATABLE_READ - + + +
READ_COMMITTED - - + +
ODCZYT_UNCOMMITTED - - - +

13. Co to jest zastrzyk SQL?

Wstrzykiwanie SQL to jedna z metod włamania się na stronę internetową, której istotą jest wstrzyknięcie do danych jakiegoś kodu SQL poprzez GETzapytania POSTlub pliki Cookies. Jeśli strona internetowa wykonuje takie zastrzyki, istnieje możliwość uzyskania dostępu do bazy danych i zhakowania aplikacji. Na przykład znamy nazwę jakiejś zmiennej. Powiedzmy column_namez typem boolean. Jeśli system jest podatny na zastrzyki, możemy dodać OR column_name=true, a następnie zapisać z bazy wszystko, czego potrzebujemy. ORutworzy warunek OR, a naszym wyrażeniem po nim zawsze będzie true, co zaprowadzi nas dalej. Atak na stronę internetową typu SQL Injection jest możliwy w wyniku nieprawidłowego przetwarzania danych przychodzących wykorzystywanych w zapytaniach SQL. Łącząc się z bazą danych za pomocą JDBC , używasz różnych plików Statements. Aby zwiększyć bezpieczeństwo, konieczne jest użycie PreparedStatementzamiast zwykłego Statement, ponieważ podczas użycia Statementciągi zapytań i wartości są po prostu dodawane do siebie, umożliwiając zastrzyki. Z kolei istnieje PreparedStatementkonkretny szablon żądania, a dane są do niego wstawiane z uwzględnieniem cudzysłowów. W rezultacie zastrzyki SQL będą postrzegane jedynie jako ciąg znaków reprezentujący jakieś pole. Aby zabezpieczyć się przed wstrzyknięciami SQL, możesz zastosować kontrole oparte na wyrażeniach regularnych (więcej o wyrażeniach regularnych przeczytasz w tym artykule ). Собеседование разработчика: разбор вопросов по базам данных - 9Inną opcją jest ustawienie limitu liczby znaków przychodzących parametrów: na przykład, jeśli masz otrzymać liczbę nie większą niż 9999, wystarczy ograniczenie czterech przychodzących znaków. Zmniejszy to ryzyko włamań za pomocą zastrzyków SQL.Więcej o bezpieczeństwie w Javie możesz dowiedzieć się z artykułu „Bezpieczeństwo w Javie: najlepsze praktyki” .

14. Czym są procedury składowane? Zapisane funkcje? Spust?

Procedury składowane w języku SQL są jednostką w bazie danych, która jest zestawem instrukcji SQL, które są jednorazowo kompilowane i przechowywane na serwerze. Jednym słowem jest to analogia metod w Javie. Procedury składowane mogą wykonywać akcje na danych, zarówno zwykłe zapytania, jak i niektóre akcje, które nie są dostępne w przypadku zwykłych zapytań. Procedura to jednostka SQL, która jest tworzona raz, a następnie wywoływana poprzez przekazanie argumentów. Zaletą tego podejścia jest to, że instrukcje te można wykorzystać wielokrotnie. Procedury składowane poprawiają wydajność, zwiększają możliwości programowania i obsługują funkcje bezpieczeństwa danych. Rozważmy utworzenie procedury:
CREATE PROCEDURE procedure_name (first_param some_type, second_param some_type..)
 begin
……...
 end
Wywołanie procedury:
CALL procedure_name (first_param, second_param…..);
Funkcja składowana jest rodzajem procedury składowanej. Różnica między funkcją polega na tym, że zawsze zwraca ona tylko jedną wartość, podczas gdy procedura zawsze zwraca zestaw wartości. Procedury składowane nie mogą być łączone ze zwykłym SQL, podczas gdy funkcja przechowywana może - i to jest jej zaleta. Z drugiej strony funkcje przechowywane mają znacznie więcej ograniczeń niż procedury. Tworzenie funkcji przechowywanej:
CREATE FUNCTION function_name (first_param, second_param…..)
RETURNS some_type
 begin
……...
RETURN some_value;
end
Wywołanie funkcji zapisanej:
SELECT function_name(first_param, second_param…..);
Wyzwalacz to inny typ procedury składowanej, która nie jest wywoływana bezpośrednio przez użytkownika, ale jest aktywowana w przypadku modyfikacji danych. Oznacza to, że procedura ta jest aktywowana po spełnieniu określonych warunków, takich jak, INSERTlub DELETE, lub UPDATEdane w określonej kolumnie danej tabeli. Kiedy wyzwalacz zostanie uruchomiony, określa się go za pomocą słów kluczowych BEFORE(wyzwalacz uruchamia się przed powiązanym zdarzeniem) lub AFTER(po zdarzeniu).
CREATE TRIGGER trigger_name
ON table_name
AFTER INSERT
 begin
……...
 end

15. Ćwicz

Tak czy inaczej, najczęstszym pytaniem SQL na rozmowie kwalifikacyjnej będzie praktyka - rozwiązywanie problemów. Nie ma sensu zgadywać, jakie zadania napotkasz, ponieważ wszystko zależy od wyrafinowanej wyobraźni osoby przeciwnej. Dlatego jedyną działającą opcją byłoby lepsze wykonywanie zapytań SQL o różnej złożoności. sql-ex.ru może służyć jako źródło ćwiczeń w różnych zadaniach . Po pierwszych dwudziestu wykonanych zadaniach Twojemu rozmówcy będzie dość trudno przestraszyć Cię jakimkolwiek zadaniem SQL. Собеседование разработчика: разбор вопросов по базам данных - 11To tyle na dziś: mam nadzieję, że po przeczytaniu tego artykułu pytania dotyczące baz danych nie sprawią żadnych trudności i problemów. Dziękuję za uwagę i do zobaczenia ponownie!
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION