You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于AWS Lambda(Node)的多表DynamoDB关联查询方案咨询

可行落地方案

DynamoDB作为NoSQL数据库不支持原生SQL式的关联查询,针对你的需求有两种可直接落地的实现方案:

方案1:读时批量关联查询

适合关联的城市、州、国家主表数据更新频繁,不想做冗余存储的场景:

  1. 先查询公司信息表拿到目标公司的city、state、country关联ID
  2. 调用DynamoDB的BatchGetItemAPI一次请求拉取三张主表对应的记录
  3. 在Lambda内存中拼装完整的公司详情数据
  4. 过滤排序如果针对公司表字段,直接在查询公司表时用原生的FilterExpression和ScanIndexForward参数实现;如果针对关联主表字段,在内存中对拼装后的结果做过滤排序即可,ERP类业务量级下性能完全达标

方案2:写时冗余预聚合

适合读多写少、关联主表数据更新频率低的场景,性能最优:

  1. 在公司信息表中冗余存储你需要过滤、排序的城市、州、国家字段(比如城市名、州编码、国家名等)
  2. 当城市、州、国家主表数据变更时,通过DynamoDB Streams触发Lambda自动同步更新所有关联公司表的冗余字段
  3. 查询公司详情时单表查询即可拿到所有需要的数据,过滤排序直接用DynamoDB原生能力+GSI实现,不需要额外关联操作
Node.js 示例代码(基于AWS SDK v3)

首先安装依赖:
npm install @aws-sdk/client-dynamodb @aws-sdk/util-dynamodb

import { DynamoDBClient, BatchGetItemCommand, QueryCommand } from "@aws-sdk/client-dynamodb";
import { unmarshall } from "@aws-sdk/util-dynamodb";

// 初始化DynamoDB客户端,Lambda执行角色需要有对应表的读权限
const dbClient = new DynamoDBClient({ region: "你的AWS部署区域" });
// 替换为你自己的表名
const TABLE_CONFIG = {
  COMPANY: "erp_company",
  CITY: "erp_master_city",
  STATE: "erp_master_state",
  COUNTRY: "erp_master_country"
};

/**
 * 查询公司详情并关联地址主表信息
 * @param {string} companyId 公司ID(公司表主键)
 */
const getCompanyFullDetail = async (companyId) => {
  // 第一步:查询公司基础信息
  const companyQueryCmd = new QueryCommand({
    TableName: TABLE_CONFIG.COMPANY,
    KeyConditionExpression: "company_id = :cid",
    ExpressionAttributeValues: {
      ":cid": { S: companyId }
    },
    // 如需按公司表字段排序,新增以下参数,false为降序、true为升序
    // ScanIndexForward: false,
    // 如需按公司表字段过滤,新增以下参数
    // FilterExpression: "company_status = :status",
    // ExpressionAttributeValues: {
    //   ":cid": { S: companyId },
    //   ":status": { S: "active" }
    // }
  });
  const companyRes = await dbClient.send(companyQueryCmd);
  if (!companyRes.Items?.length) return null;
  const companyInfo = unmarshall(companyRes.Items[0]);
  const { city_id: cityId, state_id: stateId, country_id: countryId } = companyInfo.address;

  // 第二步:批量查询地址主表关联数据
  const batchQueryCmd = new BatchGetItemCommand({
    RequestItems: {
      [TABLE_CONFIG.CITY]: { Keys: [{ city_id: { S: cityId } }] },
      [TABLE_CONFIG.STATE]: { Keys: [{ state_id: { S: stateId } }] },
      [TABLE_CONFIG.COUNTRY]: { Keys: [{ country_id: { S: countryId } }] }
    }
  });
  const batchRes = await dbClient.send(batchQueryCmd);
  // 解析主表返回结果
  const cityInfo = batchRes.Responses[TABLE_CONFIG.CITY]?.map(unmarshall)[0] || {};
  const stateInfo = batchRes.Responses[TABLE_CONFIG.STATE]?.map(unmarshall)[0] || {};
  const countryInfo = batchRes.Responses[TABLE_CONFIG.COUNTRY]?.map(unmarshall)[0] || {};

  // 第三步:拼装完整返回结果
  return {
    ...companyInfo,
    address: {
      ...companyInfo.address,
      city_detail: cityInfo,
      state_detail: stateInfo,
      country_detail: countryInfo
    }
  };
};

export default getCompanyFullDetail;
注意事项
  • 如果你需要支持多公司批量查询+关联过滤,优先选择方案2做冗余存储,搭配GSI可以直接实现DynamoDB原生的过滤排序,性能远高于内存操作
  • BatchGetItem单次请求最多支持拉取100条记录,如果需要批量查询大量公司的关联数据,把关联ID拆分批次调用即可
  • 方案2的冗余字段同步可以直接用DynamoDB Streams实现,不需要额外做业务逻辑侵入
官方文档参考
  • DynamoDB BatchGetItem 接口说明:可查阅AWS官方DynamoDB开发指南中的批量获取项目章节
  • DynamoDB Query 接口说明:可查阅AWS官方DynamoDB开发指南中的查询操作章节
  • AWS SDK for JavaScript v3 参考:可查阅AWS官方JavaScript SDK v3文档中的DynamoDB客户端部分

内容的提问来源于stack exchange,提问作者mswo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 11:06:03