Шаблон проектирования списка смежности MM DynamoDB
Ссылаясь на https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/bp-adjacency-graphs.html. Мне было интересно, если кто-нибудь может мне помочь.
Первое изображение таблицы, а второе - GSI. Вот таблица:
На столе, я не понимаю, как создать ключ сортировки? Это один атрибут, который хранит как 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:
Спасибо всем заранее!!!:-)
2 ответа
На первой картинке, которую вы разместили, элементы в базовой таблице (первичный ключ) будут выглядеть так:
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:Actor1 Maya Rudolph
Вот ваши вопросы:
Partition key: Album1
Дает вам ВСЕ информацию (включая треки) в альбоме 1 (темная сторона)
Partition key: Album1 and Sort Key: Album1:Track2
Дает вам только информацию о дыхании.
Partition key: Movie8
Дает вам ВСЮ информацию (включая актеров) на Movie8 (Идиократия)
Если бы я создавал таблицу, я бы сделал так, чтобы слова "Фильм", "Альбом" и т. Д. Были частью фактического идентификатора (скажем, "Movie018274" и "Альбом983745987"), но это не обязательно, это просто делает идентификаторы более удобочитаемыми.
Ответ Стю не совсем правильный, таблица выглядит так, как показано:
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!