我正在为nodejs中的DynamoDB设计数据库层。考虑到亚马逊的建议,一个普通的Web应用程序应该只使用一个数据库表,所以我只是想知道如何进行哈希/范围键设计。
因此,假设使用此数据库层的程序员可以定义数据实体类型,并且每种类型都将具有a)主标识符和b)实体类型专用的不同字段。数据将通过以下方式查询:a)实体主ID和实体类型(主ID对于实体类型必须是唯一的),或b)字段值(使用各种比较运算符)。
让我们以实体类型(用户)为例。典型的用户对象可能如下所示:
{
username: 'Bob',
email: 'bob@bob.com',
password: 'asdfadsfasdf',
history: {
added: 1538716051,
donations: 1000,
orders: [
{
time: 1538714556,
items: [
{ SKU: 'adfasdfas', qty: 2 },
{ SKU: 'bhhrdsgf', qty: 1 },
],
},
{
time: 1538344765,
items: [
{ SKU: 'vfgsre', qty: 3 },
{ SKU: 'nnns', qty: 2 },
],
},
],
},
}
在此示例中,user
是实体类型,username
是唯一ID,并且email
,password
和history
都是类型实体类型的特定于字段。假设我们知道我们将最常按用户名查询(完全匹配),有时我们会寻找捐款数量最高或最低的用户,或者有时我们会寻找在特定时间后下订单的用户日期(或最近未下订单的日期)。
程序员将能够在应用程序中指定其他实体类型,例如博客文章,这些实体将具有完全不同的字段集(title
,body
,tags
等。),但显然在DynamoDB中,我们不应该像MYSQL那样为每个表创建新表。此外,我们还需要一种设计数据库的方法,该数据库将允许将来以不同方式通过字段值及其主要ID查询类型定义的实体。并且字段可以是复杂的和嵌套的。 Web应用程序的平均页面请求将查询来自不同实体类型的许多不同实体,因此,我认为这可以帮助将查询负载分散到各个分区。另外,在指定如何查询数据时,这可以以某种方式提供帮助吗?如果我们知道一次查询多个实体类型,是否可以帮助加快查询速度?
什么是实现此目的的良好哈希/范围键策略?例如,如果我们开始将订单视为一种新的实体类型并将对它们的引用存储在用户对象中,而不是将订单的完整值存储在模型中,模型是否会更改?可以像亚马逊建议的那样只用一张桌子吗?