CodeGym /Kursy /SQL SELF /Typowe błędy przy pracy z tablicami i sposoby ich unikani...

Typowe błędy przy pracy z tablicami i sposoby ich unikania

SQL SELF
Poziom 36, Lekcja 4
Dostępny

Dziś kończymy naszą fascynującą podróż po pracy z tablicami w PostgreSQL. Na tapecie — typowe błędy, na które możesz się natknąć, i co najważniejsze, jak ich unikać. Jeśli kiedykolwiek łapałeś się na myśli, że "ta tablica znowu robi coś dziwnego", to ten wykład jest dla ciebie. No to lecimy.

Błędy przy tworzeniu tablic: problemy z typami danych w tablicy

Kiedy tworzysz tablice w PostgreSQL, ważne jest, żeby pamiętać, że wszystkie elementy tablicy muszą być tego samego typu. Na przykład:

SELECT ARRAY[1, 2, 'trzy'];
-- Błąd: w tablicy elementy muszą być tego samego typu

PostgreSQL nie pozwoli mieszać liczb i stringów w jednej tablicy. Jeśli jednak musisz to zrobić, użyj konwersji:

SELECT ARRAY[1::TEXT, 2::TEXT, 'trzy'];
-- Teraz tablica składa się ze stringów

Błędy przy używaniu ARRAY[] z różnymi typami danych

Domyślnie PostgreSQL próbuje określić typ tablicy na podstawie jej zawartości. Jeśli dasz tablicy niejednoznaczne dane, szykuj się na błąd:

SELECT ARRAY[1, NULL];
-- Błąd: PostgreSQL nie wie, jak zinterpretować NULL

Żeby rozwiązać problem, jawnie podaj typ danych:

SELECT ARRAY[1, NULL]::INTEGER[];
-- Wszystko działa poprawnie

Błędy przy pobieraniu danych: problemy z indeksami tablicy

Jeśli jesteś przyzwyczajony do programowania w Pythonie albo JavaScript, gdzie indeksowanie tablic zaczyna się od zera, to w PostgreSQL czeka cię niespodzianka. Tutaj tablice indeksowane są od 1.

SELECT ARRAY[10, 20, 30][0];
-- Błąd: indeks musi zaczynać się od 1

Poprawne zapytanie:

SELECT ARRAY[10, 20, 30][1];
-- Wynik: 10

Błędy przy używaniu funkcji do pobierania danych

Funkcje takie jak unnest() mogą wprowadzać zamieszanie, jeśli nie pamiętasz, że "rozwijają" tablicę na wszystkie wiersze:

CREATE TEMP TABLE example (
    id SERIAL PRIMARY KEY,
    tags TEXT[]
);

INSERT INTO example (tags) VALUES (ARRAY['tag1', 'tag2']), (ARRAY['tag3']);

SELECT unnest(tags) FROM example;
-- Wynik:
-- tag1
-- tag2
-- tag3

Jeśli chcesz zachować kontekst wiersza (np. id), dodaj go jawnie:

SELECT id, unnest(tags) AS tag FROM example;
-- Wynik:
-- id | tag
--  1 | tag1
--  1 | tag2
--  2 | tag3

Błędy przy filtrowaniu i porównywaniu tablic

  1. Nieprawidłowe użycie operatorów @>, <@, &&

Te operatory są przeznaczone do konkretnych zadań:

  • @> sprawdza, czy tablica zawiera inną tablicę.
  • <@ sprawdza, czy tablica jest zawarta w innej tablicy.
  • && sprawdza, czy dwie tablice mają część wspólną.

Błąd pojawia się, jeśli używasz ich niezgodnie z przeznaczeniem:

SELECT ARRAY[1, 2, 3] @> 2;
-- Błąd: operator @> jest przeznaczony dla tablic

Poprawnie:

SELECT ARRAY[1, 2, 3] @> ARRAY[2];
-- Wynik: true
  1. Problemy z wydajnością przy braku indeksów

Jeśli intensywnie używasz operatorów do tablic i widzisz spowolnienie zapytań, pewnie zapomniałeś o indeksowaniu. Oto przykład indeksowania tablicy:

CREATE INDEX idx_tags ON example USING GIN (tags);

Teraz zapytania z @> i && wykonują się dużo szybciej.

Błędy przy modyfikacji tablic

  1. Usuwanie i dodawanie wartości

Funkcje array_remove() i array_append() nie zmieniają tablicy "w miejscu", tylko zwracają nową tablicę. Jeśli oczekujesz, że oryginalna tablica się zmieni, to błąd:

UPDATE example
SET tags = array_remove(tags, 'tag1');
-- Teraz tablica jest zaktualizowana

Jeśli zapomnisz dodać SET tags =, SQL wykona zapytanie, ale tablica się nie zmieni.

  1. Duplikowanie danych przy użyciu array_append()

Funkcja array_append() nie sprawdza, czy element już istnieje. To może prowadzić do duplikatów:

SELECT array_append(ARRAY['tag1', 'tag2'], 'tag1');
-- Wynik: {tag1, tag2, tag1}

Jeśli chcesz uniknąć duplikatów, użyj filtrowania:

SELECT array_remove(array_append(ARRAY['tag1', 'tag2'], 'tag1'), 'tag1') || 'tag1';
-- Wynik: {tag1, tag2}

Rekomendacje jak unikać błędów

Żeby uniknąć powyższych błędów przy pracy z tablicami:

  1. Sprawdzaj typy danych. Zawsze jawnie podawaj typ tablicy, jeśli są niejednoznaczności.
  2. Uważaj na indeksy. Pamiętaj, że tablice w PostgreSQL są indeksowane od 1.
  3. Optymalizuj zapytania z tablicami. Używaj indeksowania, żeby przyspieszyć operacje porównania i filtrowania.
  4. Testuj na małych próbkach. Jeśli zapytanie z tablicami działa wolno, sprawdź je na ograniczonym zbiorze danych, żeby znaleźć wąskie gardła.
  5. Unikaj duplikatów. Stosuj dodatkowe sprawdzenia przy dodawaniu elementów do tablicy, jeśli powtórzenia są niedozwolone.

Tablice w PostgreSQL, jak każde potężne narzędzie, wymagają szacunku i ostrożności. Z tymi wskazówkami twoje tablice już nigdy nie będą powodem nieprzespanych nocy (no, prawie). Powodzenia w projektowaniu i optymalizacji baz danych!

2
Zadanie
SQL SELF, poziom 36, lekcja 4
Niedostępne
Modyfikacja i filtrowanie tablicy
Modyfikacja i filtrowanie tablicy
1
Ankieta/quiz
Porównywanie i filtrowanie tablic, poziom 36, lekcja 4
Niedostępny
Porównywanie i filtrowanie tablic
Porównywanie i filtrowanie tablic
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION