Paweł Łukasiewicz
2023-12-05
Paweł Łukasiewicz
2023-12-05
Udostępnij Udostępnij Kontakt
Wprowadzenie

Typy danych obsługiwane przez DynamoDB obejmują te specyficzne dla atrybutów, akcji oraz są zależne od wybranego języka programowania. Zanim przejdziemy do utworzenia swojej pierwszej tabeli spojrzymy jeszcze na różne typy atrybutów, ponieważ będziemy ich używać regularnie od kolejnego wpisu.

DynamoDB obsługuje różne typy danych dla atrybutów tabeli. Każdy typ danych należy do jednej z poniższych kategorii:

  • Scalar - typ skalany reprezentuje dokładnie jedną wartość. Typy skalane to: liczba, ciąg znaków, wartość binarna, logiczna oraz null;
  • Document - typ ten reprezentuje złożoną strukturę jaką można znaleźć w dokumencie JSON. Typami dokumentów są list oraz map. Pierwszy z typów, tj. lista jest dobrze znany każdemu z Was. Atrybut typu map to nic innego jak nieuporządkowana kolekcja par nazwa-wartość. Mapy są ujęte w nawiasach klamrowych;
  • Set - typ ten reprezentuje wiele wartości skalarnych. Typy zestawów (set) to zestaw liczbowy, łańcuchowy oraz binarny.

Podczas tworzenia tabeli lub indeksu wtórnego musimy określić nazwy i typy danych dla każdego atrybutu klucza głównego (klucz partycji i klucz sortowania). Ponadto każdy atrybut klucza głównego musi zdefiniowany jako string, number lub wartość binarna.

DynamoDB jest bazą danych NoSQL i jest pozbawiona schematów. Oznacza to, że poza atrybutami klucza głównego nie musimy definiować żadnych atrybutów ani typów danych podczas tworzenia tabeli. Dla porównania, relacyjne bazy danych, wymagają zdefiniowania nazwy i typu danych dla każdnej kolumny podczas tworzenia tabeli – ale o tym doskonale wiecie.

Przejdźmy do opisu każdego typu danych wraz z przykładami formacie JSON (tam gdzie jest to potrzebne).

Typy skalarne

Typy skalane to: number, string, binary, boolean oraz null.

  • Number - ograniczone do 38 cyfr, dodanie, ujemne lub zerowe;
  • String - znaki Unicode z kodowaniem UTF-8. Minimalna długość łańcucha może wynosić 0 jeżeli atrybut nie jest używany jako klucz dla indeksu lub tabeli i jest ograniczony przez maksymalny limit rozmiaru elementu DynamoDB wynoszący 400KB;
  • Binary - przechowuje dowolne dane binarne, np. zaszyfrowane dane, obrazy czy skompresowany tekst. Porównywanie wartości binarnych przez DynamoDB odbywa się na poprzez traktowanie każdego bajta danych binarnych jako niepodpisany (unsigned);
  • Boolean - przechowuje wartość true lub false;
  • Null - reprezentuje nieznany(unknown) lub nieokreślony(undefined) stan.

Typy dokumentów

Typami dokumentów są lista i mapa. Te typy danych mogą być zagnieżdżone wewnątrz siebie, aby reprezentować złożone struktury danych do 32 poziomów głębokości.

Nie ma limitu na liczbę wartości w liście lub mapie o ile element zawierający wartości mieści się w limicie rozmiaru elementu DynamoDB, tj. 400KB.

Wartość atrybutu może być pustym łańcuchem lub pustą wartością binarną, jeżeli atrybut nie jest używany jako klucz tabeli lub indeksu. Wartość atrybutu nie może być pustym zbiorem (zestaw łańcuchów, liczb lub binarny), jednakże puste listy i mapy są dozwolone. Puste wartości łańcuchowe i binarne są dozwolone wewnątrz list i map.

Lista: Atrybut typu list może przechowywać uporządkowany zbiór wartości. Listy są ujęte w nawiasy kwadratowe: […]

Lista jest podobna do tablicy JSON. Nie ma ograniczeń co do typów danych, które mogą być przechowywane w elemencie listy a elementy w elemencie listy nie muszą być tego samego typu.

Poniżej prosty przykład przedstawiający listę zawierającą dwa ciągi znaków i liczbę:

FavoriteThings: ["Cookies", "Coffee", 3.14159]

Mapa: Typ map może przechowywać nieuporządkowaną kolekcję par nazwa-wartość. Mapy są ujęte w nawiasy klamrowe: {…}

Mapa jest podobna do obiektu JSON. Nie ma ograniczeń co do typów danych, które mogą być przechowywane w elemencie mapy a elementy mapy nie muszą być tego samego typu.

Mapy są idealne do przechowywania dokumentów JSON w DynamoDB. W poniższym przykładzie możecie zobaczyć mapę, która zawiera ciąg znaków, liczbę i zagnieżdżoną listę, która zawiera inną mapę:

{
  Day: "Monday",
  UnreadEmails: 42,
  ItemsOnMyDesk: [
    "Coffee Cup",
    "Telephone",
      {
        Pens: { Quantity : 3},
        Pencils: { Quantity : 2},
        Erasers: { Quantity : 1}
        }
    ]
}

Sets: DynamoDB obsługuje wszystkie typy, które reprezentują zestawy wartości liczbowych, łańcuchowych lub binarnych. Wszystkie element wewnątrz zestawu muszą być tego samego typu, np. atrybut typu number set może zawierać tylko liczby, atrybut typu string set może zawierać tylko łańcuchy, itd.

Nie ma limitu na liczbę wartości w zestawie o ile element zawierający wartości mieści się w limicie rozmiaru elementu DynamoDB.

Każda wartość w zestawie musi być unikalna. Kolejności wartości w ramach zestawu nie jest zachowana. Aplikacje, które piszemy nie mogą polegać na żadnej konkretnej kolejności elementów w ramach zestawu. DynamoDB nie obsługuje pustych zestawów. Musimy jednak pamiętać, że puste łańcuchy i wartości binarne są dozwolone w ramach zestawu.

Spójrzmy jeszcze na przykład składający się z zestawu łańcuchów, liczb oraz wartości binarnych:

["Black", "Green", "Red"]
[42.2, -19, 7.5, 3.14]
["U3Vubnk=", "UmFpbnk=", "U25vd3k="]