簡體   English   中英

使用DynamoDb(NoSQL)建模多對多

[英]Modeling many to many with DynamoDb (NoSQL)

我正在開展一個需要存儲USERSTECHNIQUESSKILLS的項目 TECHNIQUESSKILLS都與用戶進行N:M實現。

我是NoSQL的新手,無法繞過這個想法。 該應用程序將使用戶有機會將這些技術技能添加到用戶 然后我需要構建一個查詢TECHNIQUESSKILLS的函數,找到所有具有查詢的TECHNIQUESSKILLS的用戶

我遵循了Udemy課程,但我沒有得到我理解的例子。 這里有stackoverflow,有幾個例子,但它們與我的例子不同。

我想我只需要看看一個有經驗的NoSQL人如何解決這個問題讓我走了。

我的第一個想法(我只是自己學習DynamoDB,所以這可能是天真的)將是一個帶有復合排序鍵和全局二級索引的USER表:

使用USERS作為分區鍵創建表,並使用TECH和SKILL屬性創建表,並生成復合TECHSKILL字段作為排序鍵。 您可以在輸入解析器中添加TECHSKILL字段值(只需使用分隔符連接TECHNIQUE和SKILL,類似於TECHNIQUE#SKILL)。 這使您可以使用排序鍵上的查詢條件(例如,'starts-with')查明給定的USER是否具有特定的TECH或SKILL。

然后在TECH和SKILL以及TECH:SKILL字段上添加全局二級索引(因此您有三個GSI),每個都有USER作為其排序鍵。 現在,您可以查詢TECH GSI以查找具有給定TECH的所有USER,或查詢SKILL GSI,或甚至查詢具有給定TECH:SKILL組合的所有USER。

使用這種多GSI方法,您可以針對不同的查詢以不同方式管理讀/寫容量。

如果用戶可以多次使用TECHSKILL組合,那么這種方法效率很低(我認為)。 例如,假設TECHNIQUE是“驅動程序”,並且SKILL字段包含駕駛執照類別(TYPE_A,TYPE_C等)。 現在讓USER在一年中的部分時間獲得TYPE_A許可,然后她獲得TYPE_C(所以,新記錄),但隨后TYPE_C認證失效並且她在不同的日期范圍內返回TYPE_A並且您有一個主鍵碰撞,你會得到一個元組列表,而不僅僅是一個,你必須處理它。 如果您不想傳輸/檢查/排序查詢返回(可能是一個很長的列表!),您可能需要一個不同的設計,可能涉及開始/結束日期作為索引排序鍵的一部分。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM