Дизайн шаблона списка динамомашин DynamoDB MM

Ссылаясь на https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-adjacency-graphs.html. Мне было интересно, если кто-нибудь может мне помочь.

Первое изображение таблицы, а второе - GSI. Вот таблица: enter image description here

На столе, я не понимаю, как создать ключ сортировки? Это один атрибут, который хранит как Bill- ID, так и Invoice- ID? или два отдельных атрибута? Я чувствую, что это один гибкий атрибут, и если да, то как вы отличаете одно от другого? И как нам построить запрос по ключу сортировки?

Это просто, глядя на префикс "Bill-" или "Invoice-"? Практика DynamoDB, кажется, использует тире ("-") для разделения значений в атрибуте. Если кто-то может дать мне примеры использования таких вещей, я был бы также благодарен, но я ухожу, если это не важно в этом случае.

Это очень интересный и очень интересный https://youtu.be/xV-As-sYKyg?t=1897, где докладчик использует ОДНУ таблицу продуктов для хранения различных типов предметов: книг, альбомов песен и фильмов; и у каждого есть свои атрибуты.

Опять же, у меня проблема с пониманием ключа сортировки, используемого там. Я понимаю, что productID = 1 - это bookID, а productID = 2 - это альбом. Теперь, где это сбивает с толку, я обведен красным. Это дорожки из альбома 2. Однако структура ключа сортировки - "идентификатор альбома: дорожка". Теперь, где находится "trackID"? Это означает заменить слово "trackID" фактическим идентификатором? или это должен быть текст в точности как "albumID: trackID"?

Что делать, если я хочу запросить конкретный trackID? какой будет синтаксис моего запроса?

Пожалуйста, смотрите изображение здесь с YouTube: enter image description here

Спасибо всем заранее!!! :-)

Ответ 1

На первой картинке, которую вы разместили, элементы в базовой таблице (первичный ключ) будут выглядеть так:

First_id(Partition key)        Second_id(Sort Key)          Dated
-------------                   ----------                  ------
Invoice-92551                   Invoice-92551               2018-02-07
Invoice-92551                   Bill-4224663                2017-12-03
Invoice-92551                   Bill-4224687                2018-01-09
Invoice-92552                   Invoice-92552               2018-03-04
Invoice-92552                   Bill-4224687                2018-01-09

И те же предметы в GSI предметы будут выглядеть так

Second_id(Partition Key)       First_id
----------                     ---------------
Invoice-92551                  Invoice-92551 
Bill-4224663                   Invoice-92551 
Bill-4224687                   Invoice-92551 
Invoice-92552                  Invoice-92552
Bill-4224687                   Invoice-92552 

Они нарисовали это довольно запутанным способом.

  • Они слили ключи разделов в один блок, но они являются отдельными элементами.
  • Они также пытались показать GSI на том же рисунке. Вы можете думать о базовой таблице и GSI как о двух отдельных таблицах, которые во многом синхронизированы, чем они являются.
  • На самом деле они не предоставили имя ключевым атрибутам. В моем примере я назвал их First_id и Second_id.

Когда вы делаете запрос к базовой таблице, вы можете использовать запрос с ключом разделения Invoice-92551 и вы получите как элемент Invoice, так и все принадлежащие ему элементы счета.

Представьте, что вы просматриваете счет Invoice-92551 фактуру Invoice-92551 в приложении и видите, что у него есть два связанных счета (Bill-4224663 и Bill-4224687). Если вы нажмете на счет, приложение, вероятно, сделает запрос в GSI. Запрос GSI будет иметь ключ разделения Bill-4224687. Если вы посмотрите на таблицу GSI, которую я нарисовал выше, вы увидите, что это вернет два элемента, показывая, что Bill-4224687 является частью двух счетов (Invoice-92551 и Invoice-92552)


На втором изображении слова "bookID" и "albumID" и т.д. Должны представлять действительные идентификаторы (скажем, 293847 и 3340876).

Я бы нарисовал его пример так:

ProductID(Partition Key) TypeID(Sort Key)  Title          Name      
---------                ------            ------         ------
Album1                   Album1            Dark Side
Album1                   Album1:Track1     Speak to me
Album1                   Album1:Track2     Breathe
Movie8                   Movie8            Idiocracy
Movie8                   Movie8:Actor1                    Luke Wilson
Movie8                   Movie8:Actor2                    Maya Rudolph

Вот ваши вопросы:

Partition key: Album1

Дает вам ВСЕ информацию (включая треки) в альбоме 1 (темная сторона)

Partition key: Album1 and Sort Key: Album1:Track2

Дает вам только информацию о дыхании.

Partition key: Movie8

Дает вам ВСЮ информацию (включая актеров) на Movie8 (Идиократия)

Если бы я создавал таблицу, я бы сделал так, чтобы слова "Кино", "Альбом" и т.д. Были частью фактического идентификатора (скажем, "Movie018274" и "Альбом983745987"), но это не обязательно, это просто делает идентификаторы более читабельными.

Ответ 2

Ответ Stu не совсем корректен, таблица на самом деле выглядит так, как показано:

First_id(Partition key)        Second_id(Sort Key)          Dated
-------------                   ----------                  ------
Invoice-92551                   Invoice-92551               2018-02-07
Invoice-92551                   Bill-4224663                2017-12-03
Invoice-92551                   Bill-4224687                2018-01-09
Invoice-92552                   Invoice-92552               2018-03-04
Invoice-92552                   Bill-4224687                2018-01-09
Bill-4224663                    Bill-4224663                2018-12-03
Bill-4224687                    Bill-4224687                2018-01-09

В приведенной выше таблице позиции счета (т.е. Ключ раздела = Bill-xxxxx) содержат общую информацию для счета, где в качестве позиций счета-фактуры с элементами счета в качестве ключа сортировки хранится информация для счета, специфичная для данного счета.

Для полной реконструкции счета требуется GSI, который позволяет вам искать полную информацию для счета (то есть общая запись + записи, относящиеся к счету):

Second_id(Partition Key)       First_id                   Data
----------                     ---------------            -----------
Bill-4224663                   Bill-4224663               Common bill data
Bill-4224663                   Invoice-92551              Bill data for Invoice-92551
Bill-4224687                   Bill-4224687               Common bill data
Bill-4224687                   Invoice-92551              Bill data for Invoice-92551
Bill-4224687                   Invoice-92552              Bill data for Invoice-92552
Invoice-92551                  Invoice-92551              Redundant data!
Invoice-92552                  Invoice-92552              Redundant data!