English 中文(简体)
DynamoDB 单一表格设计
原标题:DynamoDB single table design

I m 利用DynamoDB作为数据库建造一台仪器。 我有用户、组织、项目和文字的概念。

  • An Organization has many projects
  • A project or organization has many scripts
  • A user can be part of a single organization so an organization can have many users.
  • A script can either belong to a project or an organization. Each script has revisions which needs to be store so that users can rollback to previous version.

(a) 利用案件需要查询:

  • Get all users belonging to a organization
  • Get all projects belonging to a organization
  • Get all scripts belonging to a project
  • Get script by id
  • Get all versions of the script by script id
  • Get latest version of the script by script id
  • Get organization by org id
  • Get project by project id
  • Get script by script id

我正在考虑建立一个单独的表格<代码>Entities:

pk sk type (gsi1-pk) parent (gsi1-sk)
root#org-1 info org root
org-1#proj-1 info project org-1
proj-1#script-1 info script proj-1
proj-1#script-1 rev_latest script_revision script-1
proj-1#script-1 rev_1 script_revision script-1
proj-1#script-1 rev_2 script_revision script-1
org-1#user-1 info user org-1
org-1#user-2 info user org-1

PK和SK将允许我获得提供该身份证的具体项目的数据。 关于我亲子的id子和需要打孩子的问题,我会创立一个GSI并对此提出质询。

就PK而言,我可以放弃第一张前标,因为上面在括号中界定了多余的母物体,但我离开这里来防止意外的交叉物体更新。

我更能用多张DynamoDB表格储存这一信息?

出于经济原因,我宁愿不使用扫描查询。 理想的情况是,我可以通过查询和扫描操作获得所有数据。

最佳回答

这里有一个单一选择。 该设计利用 运营scan operations

pk sk gsi1pk gsi1sk
org#org-1 xInfo
proj#proj-1 xInfo org#org-1 proj#proj-1#xInfo
script#script-1 xInfo proj#proj-1 script#script-1#xInfo
script#script-1 rev#2023-10-05T22:00:00 proj#proj-1 script#script-1#rev#2023-10-05T22:00:00
script#script-1 rev#2023-03-13T10:00:00 proj#proj-1 script#script-1#rev#2023-03-13T10:00:00
script#script-1 rev#2022-12-20T08:00:00 proj#proj-1 script#script-1#rev#2022-12-20T08:00:00
user#user-1 xInfo org#org-1 user#user-1#xInfo
user#user-2 xInfo org#org-1 user#user-1#xInfo

表格主要介绍了记录。 The partition key pk has the Format <entity-type>#<entity-id>. 我认为,<代码>entity-type 预设装置有助于直观确定一个记录实体类型,但在此是任择的。 关键<代码>sk界定了记录类型。 文字有两种记录类型,即文字和修改。 将文字修订称为“id”使检索所有修订或只是最新修订1。 我改名为info/code> 至xInfo,以便在对成文令的所有修订之后,将“info”记录移至<>2。 为什么这样做? 因此,我们可以通过<条码>pk在单项操作中查询(ScanIndexForward:不实)的文字,其限额为2,以获取信息记录和最新修订。 没有限制所有修订和索引记录。

利用表格作为回答所有“直截了当”问题的关键。 我们需要一个处理“归属”问题的指数。

The secondary index partition key (gsi1pk) models the "belongs to" relation. Organizations appear not to belong to anything, so the index is blank. The index sort key gsi1sk takes the form <entity-type>#<entity-id>#<record-type>. The record-type suffix isn t needed except for scripts, but seems like a good idea to apply everywhere for consistency and future-proofing.

"Get all users belonging to a organization" is answered with a query of gsi1pk = org#org-1 and gsi1sk > "user#". The same pattern satisfies the other "belongs to" queries.

致闭幕词 更不用多份动力表......? 在你的设计中包含多个表格,给你更多的建模选择。 你们仍在分治和确定钥匙。 在某些情况下可能需要多个表格,但确实无助于建模。


  1. 时间组成部分还使你可以选择按期

  2. 页: 1 信息,只要预先确定的性质在UTF-8 ,>sort Order 。 我们这样做是为了设计一种有用的文字(指示)秩序:信息记录、最新修订、最新-1修订等。

问题回答

你试图执行的模式被称为EAV(实体-对象-价值)。

它主要用于多功能数据库,在多功能数据库中,能够建立和改变一套实体及其属性。

例如,在网上购物平台上,供应商可以就洗衣机的特性(载重机类型、周期数、能源效率等)建立一套标签,并在不改变数据库配置的情况下添加和删除其认为合适的特性。

如此,这种模式对于某些使用案例来说是一种必要的邪恶,而你就是这样。

我认为,设计建议对于这个方面来说是无可比拟的,因为它们自然过于广泛,而且基于见解。 因此,我要指出与你的设计有关的几个更具体的问题,因为这个问题可以客观地解决。

Hot partitions

采用硬编码资源类型作为你的全球倡议的一个分门槛,将使所有记录都成为单一分门别类,这将成为DynamoDB的“隔热”。

说到,每增加一次文字修订,Dynamo就必须在<条码>(类型、母体)上加入《全球倡议》的条目,该条目将涉及储存“PK值”的单一分部分编码<条码>。

DynamoDB recommendations explicitly spell it out:

地位法,只有少数可能的地位法典: Bad

Lack of natural ordering

页: 1 你们要么总是把所有修订工作推向客户,要么在修订日期之外增加和索引,只为修订工作填写。 如果是这样的话,那么为什么根本不做,只是建立一个单独的表格?

Extra updates

Every time you add a new revision, you will need to update the previous rev_latest to rev_xxx, and you will only know what xxx is after a full sort (or querying a secondary index). This will also be prone to race conditions.





相关问题
How to model a many-to-many relationship in App Engine?

I have a question regarding how to model a many-to-many relationship in App Engine: A Blogentry can have many tags, a tag can apply to many blog entries. I see a couple of scenarios: Use a Set of ...

How to emulate tagged union in a database?

What is the best way to emulate Tagged union in databases? I m talking about something like this: create table t1 { vehicle_id INTEGER NOT NULL REFERENCES car(id) OR motor(id) -- not valid ... } ...

Users asking for denormalized database

I am in the early stages of developing a database-driven system and the largest part of the system revolves around an inheritance type of relationship. There is a parent entity with about 10 columns ...

How to best implement a 1:1 relationship in a RDBMS?

Yesterday while working on a project I came up on a peculiar 1:1 relationship which left me wondering - how to best implement this (clearly, we had done it wrong :D) The idea is that there are two ...

Automatic filling entity properties

I have some type an architect(?) question I develop an application, based on Spring and Hibernate (annotated configuration) For each table in my database I added 4 fields: createdBy and modifiedBy(...