DynamoDB는 외래 키를 지원하나요?

아니요. DynamoDB에는 외래 키도, 참조 무결성 제약도, 연쇄 삭제도 없습니다 — NoSQL 데이터베이스로서 항목이나 테이블 사이의 관계를 결코 강제하지 않습니다. 대신 관계는 직접 모델링합니다. 관련 데이터를 하나의 항목으로 비정규화하거나, 단일 테이블 설계로 관련 항목들을 공유 파티션 키 아래 함께 두는 것입니다. 그렇게 모델링한 관계를 보고 따라가려면, DynoTable의 Smart Table이 캔버스 위에 두 테이블의 관계를 그리고 조인된 행을 탐색하게 해 줍니다.

외래 키가 없는 이유

외래 키는 정규화된 테이블 전반의 조인을 뒷받침하고 무결성을 강제하기 위해 존재합니다. DynamoDB는 JOIN 연산자를 의도적으로 생략했고(AWS는 대신 비정규화를 권장합니다), 따라서 외래 키 제약은 쿼리 모델이 애초에 활용하지 않는 관계를 단속하게 됩니다. 다른 항목의 키를 속성으로 저장하는 것을 막는 것은 없습니다 — DynamoDB가 그것을 검증하거나 연쇄 처리하지 않을 뿐입니다.

대신 관계를 모델링하는 방법

  • 임베드 — 작고 경계가 분명한 자식 데이터는 부모 항목 안에 리스트나 맵으로 둡니다.
  • 함께 두기 — 부모와 자식이 파티션 키를 공유하고 정렬 키를 달리하므로, Query 하나가 관계 전체를 반환합니다. 이것이 단일 테이블 설계의 핵심입니다.
  • 복제 — 각 액세스 패턴이 필요로 하는 필드를 그것이 필요한 항목에 복사하고, 단일 요청 읽기를 얻는 대신 쓰기 시점의 관리 부담을 받아들입니다.

일대다다대다 가이드가 각 형태를 깊이 다룹니다.

무결성이 정말 중요할 때 강제하기

제약에 기댔을 법한 경우를 위해 DynamoDB는 구성 요소를 제공합니다. 조건 표현식은 쓰려는 항목의 상태를 기준으로 쓰기를 보호하고, 트랜잭션의 ConditionCheck는 같은 전부 아니면 전무 작업 안에서 다른 항목(예: 부모)이 존재하는지 검증할 수 있습니다. 연쇄 삭제는 명시적인 애플리케이션 로직이나 Streams 기반 정리 작업이 됩니다.

실제로 실행하면 이렇게 보입니다

pk = "CUSTOMER#1" 아래에 PROFILE 항목 하나와 ORDER# 항목 두 개를 넣고, 프로필을 삭제한 뒤 파티션을 다시 쿼리했습니다:

Count: 2
[{"sk":{"S":"ORDER#1"},"pk":{"S":"CUSTOMER#1"}},
 {"sk":{"S":"ORDER#2"},"pk":{"S":"CUSTOMER#1"}}]

삭제는 성공을 반환했습니다. 고아 둘, 경고 없음, 잡을 오류도 없음. PostgreSQL에서라면 같은 삭제가 어떤 제약을 선언했느냐에 따라 실패하거나, 연쇄되거나, 자식 참조를 null로 만듭니다.

이제 가장 가까운 대체물입니다. 세 번째 주문을 쓰기 전에 부모를 조건 검사하는 TransactWriteItems입니다.

TransactionCanceledException: Transaction cancelled, please refer cancellation
reasons for specific reasons [ConditionalCheckFailed, None]

CancellationReasons: [
  {"Code":"ConditionalCheckFailed","Message":"The conditional request failed."},
  {"Code":"None"}
]

배열 위치는 여러분의 TransactItems 위치와 대응하므로, [ConditionalCheckFailed, None]은 0번 작업(부모 검사)이 실패했고 1번 작업(자식 쓰기)은 문제없었다는 뜻입니다. 가드가 하나일 때는 그것이 명료하게 읽히지만, 작업이 여덟 개라면 그 배열이 어느 것이 깨졌는지 알아낼 유일한 방법입니다.

요금도 부과됩니다. 트랜잭션 쓰기는 항목당 쓰기 단위 두 개를 소비하며, AWS는 "this capacity is consumed even when the transaction is canceled"라고 분명히 밝힙니다. 거부된 모든 쓰기가 수락된 쓰기와 같은 비용을 치릅니다.

더 알아보기

단일 테이블 설계에서 시작하고, 표현식 빌더에서 보호용 조건을 만들고, DynoTable을 다운로드해 그 관계를 시각적으로 탐색하세요 — Smart Table이 캔버스 위에서 부모와 자식 테이블을 조인해 항목 컬렉션 전체를 한 화면에서 보여줍니다.

참고 자료

위에 링크된 공식 AWS 문서를 기준으로 2026-07-13에 마지막으로 검증했습니다.

고아 자식 쿼리와 취소 출력은 2026-07-28에 Node v24.18.0에서 @aws-sdk/client-dynamodb 3.1095.0으로 DynamoDB Local 3.3.0을 상대로 재현했습니다.

Console 없이 DynamoDB 작업하기

DynamoDB로는 실행할 수 없는 진짜 SQL(JOINs, GROUP BY, 집계)을 실행하는 빠른 DynamoDB 데스크톱 클라이언트. 시각적 편집과 여러분 자신의 Bedrock 키로 동작하는 AI 에이전트를 제공합니다.

30일 무료 체험, 신용카드 불필요 — 이후 기간 제한 없는 무료 요금제.