Najlepsze praktyki DyanmoDB wyjaśniają, że:
W aplikacji DynamoDB należy zachować jak najmniejszą liczbę tabel. Większość dobrze zaprojektowanych aplikacji wymaga tylko jednego stołu.
Uważam to za zabawne, że prawie każdy samouczek, który widziałem podczas pracy z DyanmoDB, ma konstrukcję wielostołową.
Ale co to oznacza w praktyce?
Rozważmy prostą aplikację z trzema głównymi podmiotami: użytkownikami, projektami i dokumentami. Użytkownik jest właścicielem wielu projektów, a Projekt może mieć wiele dokumentów. Zwykle musimy pytać o projekty dla użytkownika oraz o dokumenty dotyczące projektu. Czyta ponad liczbę zapisów ze znacznym marginesem.
Naiwny projekt tabeli wykorzystałby trzy tabele:
Users
Hash key
user-id
Projects
Hash key Global Index
project-id user-id
Documents
Hash key Global Index
document-id project-id
Mogliśmy dość łatwo zwinąć Project
i Document
do jednej Documents
tabeli:
Documents
Hash key Sort key Global Index
project-id document-id user-id
Ale po co się tu zatrzymywać? Dlaczego nie jeden stół rządzi nimi wszystkimi? Ponieważ User
jest źródłem wszystkiego ...
Users
Hash key Sort key
user-id aspect
--------- ---------
foo user email: foo@bar.com ...
foo project:1 title: "The Foo Project"
foo project:1:document:2 document-id: 2 ...
Wtedy mielibyśmy Globalny Indeks na, powiedzmy, email
polu wyszukiwania rekordów użytkownika, a drugi na document-id
polu bezpośrednich wyszukiwań dokumentów.
Czy tak to powinno działać? Czy uprawnione jest wrzucanie tak bardzo rozbieżnych rodzajów danych do tej samej tabeli? A może druga konstrukcja z dwoma stołami jest lepszym podejściem?
W którym momencie poprawne byłoby dodanie drugiej tabeli?