我的整个职业生涯都在使用非规范化的关系数据库。为了实现一个单表设计,可以在类似“App Store”的个人项目上处理几个特定的访问模式,我很难忘记所有这些。
这是一个快速的 ERD。有一个由平台(iOS、Android)和捆绑标识符标识的 App 模型以及在创建新版本时使用的默认映射。每个 App 可以有 0 到多个版本,这些版本由版本号标识(这是一个连续的数值,并且在 App 的上下文中是唯一的)。一个版本具有 IsReleased 属性以及其他几个属性(如名称、发行说明、二进制路径等)。
访问模式
- 列出每个应用程序的最新版本。
- 列出给定平台的每个应用程序的最新版本。
- 列出 IsReleased 为 1 的每个应用程序的最新版本。
- 列出 IsReleased 为 1 的给定平台的每个应用程序的最新版本。
- 获取特定应用的最新版本。
- 获取 IsReleased 为 1 的特定应用的最新版本。
- 获取特定应用的所有版本。
- 获取 IsReleased 为 1 的特定应用的所有版本。
- 获取特定应用的默认属性。
我遇到了 1 到 4 的问题,这张桌子是我要去的地方。我很难使用 GSI,它会按排序顺序为我提供单个版本的所有应用程序项目。
PK | sk | 默认值 | 应用名称 | 版本 | 被释放 | 其他属性 |
---|---|---|---|---|---|---|
app_ios_com.app.one |
defaults |
{ ... json ... } |
||||
app_ios_com.app.one |
version_1 |
应用一 | 1 | 1 | ||
app_ios_com.app.one |
version_2 |
应用一 | 2 | 1 | ||
app_ios_com.app.one |
version_3 |
应用一 | 3 | 1 | ||
app_ios_com.app.two |
defaults |
{ ... json ... } |
||||
app_ios_com.app.two |
version_1 |
应用二 | 1 | 1 | ||
app_ios_com.app.two |
version_2 |
应用二 | 2 | 0 | ||
app_ios_com.app.two |
version_3 |
应用二 | 3 | 0 |
例如,对于访问模式 1,我想要:
PK | sk | 默认值 | 应用名称 | 版本 | 被释放 | 其他属性 |
---|---|---|---|---|---|---|
app_ios_com.app.one |
version_3 |
应用一 | 3 | 1 | ||
app_ios_com.app.two |
version_3 |
应用二 | 3 | 0 |
例如,对于访问模式 3,我想要:
PK | sk | 默认值 | 应用名称 | 版本 | 被释放 | 其他属性 |
---|---|---|---|---|---|---|
app_ios_com.app.one |
version_2 |
应用一 | 3 | 1 | ||
app_ios_com.app.two |
version_1 |
应用二 | 1 | 1 |
我必须记住的一些数据限制:
- 目前只有10到20个应用程序,但我需要能够支持数百个
- 大多数应用程序将有 100 到 200 个版本,其中有 20 到 30 个发布版本。最大的应用程序有 1000 个版本,其中发布了 50 个。
- 在后端,IsReleased 标志通常会从 0 切换到 1,但偶尔会从 0 切换到 1。
- 平均版本项约为 2 KB。
- IsReleased 为 1 的访问模式变化更频繁地使用。
我觉得解决方案就在我面前,但我不能指望它。