amazon-web-services - DynamoDB 一对多关系非规范化或邻接?
问题描述
我正在为代表业务操作的数据结构设计一个表,该业务操作既可以临时执行,也可以作为批处理的一部分执行。作为批处理一起执行的操作必须是链接和可查询的,并且批处理上的元数据将被持久化。
该表必须支持 2 个查询:检索历史,即席和批处理实例。
Amazon 提出了 2 种方法,邻接和非规范化。
我不确定哪种方法最好。速度将是一个优先事项,成本次要。这将是一个多租户数据库,拥有多个组织,拥有数百万以上的运营。(Orgs 将成为分区键的一部分,用于跨节点隔离这些)
以下是我提出的想法:
- 非规范化、非邻接 - 具有 1 个(即席)或更多(批处理)操作数据的单个根包装对象。
- 非规范化的邻接 - 顶级键由操作实例(ad hoc)以及包含操作实例集合(批处理)的父对象组成
- 规范化、非邻接、重复数据 - 顶层由操作实例组成,有或没有批处理键,bd 批处理信息在批处理的所有成员之间重复
有标准的最佳实践吗?关于设置/生成密钥的任何建议?
解决方案
老实说,在 NoSQL 最具体的 DynamoDB 中用这些术语来理解这个概念让我感到困惑。对我来说,很难根据整个业务流程逐个设计dynamodb表。准确地说,我更担心数据大小而不是 DynamoDB 请求的速度,因为我们对每个请求有 1MB 的限制。换句话说,在使用 dynamodb 时,我应该忘记所有关于关系数据库概念的事情,并将数据视为 json 对象。
但是,对于非常简单的一对多(即人们喜欢一些水果)设计,我将有我最好的方案选择字符串 PartitionKey。所以我的桌子会是这样的:
|---------------------|---------------------------------------|
| PartitionKey | Infos |
|---------------------|---------------------------------------|
| PersonID | {name:String, age:Number, loveTo:map} |
|---------------------|---------------------------------------|
| FruitID | {name:String, otherProps} |
|---------------------|---------------------------------------|
样本数据:
|---------------------|---------------------------------------|
| PartitionKey | Infos |
|---------------------|---------------------------------------|
| person123 | { |
| | name:"Andy", |
| | age:24, |
| | loveTo:["fruit123","fruit432"] |
| | } |
|---------------------|---------------------------------------|
| personABC | { |
| | name:"Liza", |
| | age:20, |
| | loveTo:["fruit432"] |
| | } |
|---------------------|---------------------------------------|
| fruit123 | { |
| | name:"Apple", |
| | ... |
| | } |
|---------------------|---------------------------------------|
| fruit432 | { |
| | name:"Manggo", |
| | ... |
| | } |
|---------------------|---------------------------------------|
但是,让我们看看更复杂的案例,示例聊天应用程序。每个频道允许多个用户,每个用户都可以加入任何频道。应该是一对多还是多对多,如何建立关系?我会说我不在乎他们。如果我们将其视为关系数据库,那真是令人头疼!在这种情况下,我将使用复合 SortKey 甚至二级索引来加速特定查询。
所以,你工作的整个业务流程是什么的问题将帮助我们设计表格,而不是一块一块地
推荐阅读
- ios - 在 Siri 中提问后启动应用程序并显示提问结果
- python - Django charfield 正则表达式
- python - 如何在 django 模型中实现“其他人”
- javascript - 使用 ES6 箭头函数作为 AJAX 回调处理程序
- wpf - 如何在 WPF(xaml)中为 ToggleButton 背景颜色设置动画?
- javascript - 如何检查 node-cron 执行 cron-job 所花费的时间
- regex - 正则表达式阻止密件抄送电子邮件
- javascript - 在控制台中访问 chrome 扩展功能?
- sql - 组织结构图 SQL 查询
- php - 删除未使用的类后,Laravel 5.5 上的依赖注入不起作用