Шаблон проектирования списка смежности DynamoDB M-M - PullRequest
0 голосов
/ 07 мая 2018

Ссылаясь на 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

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

Ответы [ 2 ]

0 голосов
/ 15 ноября 2018

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

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!
0 голосов
/ 08 мая 2018

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

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-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 (Идиократия)

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...