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.
1. Czym są bazy danych? Na jakie typy się je dzieli?
Co oznacza DBMS?
Baza 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
- 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.
- 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:
- 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).
- Druga postać normalna:
- Spełnione są warunki pierwszej postaci normalnej;
- Każdy atrybut inny niż klucz odwołuje się do klucza podstawowego.
- 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ść,
null
nie 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,
UNIQUE
w 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?
W 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 DELETE
typó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, NULL
zostanie 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 DELETE
Jeś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.
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.
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.
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.
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.
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:
- Przelej pieniądze na konto bankowe.
- 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
GET
zapytania
POST
lub 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_name
z 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.
OR
utworzy 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
PreparedStatement
zamiast zwykłego
Statement
, ponieważ podczas użycia
Statement
ciągi zapytań i wartości są po prostu dodawane do siebie, umożliwiając zastrzyki. Z kolei istnieje
PreparedStatement
konkretny 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 ).
Inną 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,
INSERT
lub
DELETE
, lub
UPDATE
dane 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.
To 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!
GO TO FULL VERSION