DynamoDB 기초 지식과 boto3에서의 간단한 사용법

13534 단어 DynamoDBboto3AWS

기사 정보



DynamoDB를 사용하기 위해 배운 내용 요약

DynamoDB



NoSQL 데이터베이스 서비스

DB 구조, 용어




  • 테이블
    RDS의 테이블
  • item
    RDS에서의 레코드
  • attribute
    RDS의 열
    item간에attribute는 일치하지 않아도 된다
    이하 Partition Key, Sort Key가 되는 attribute 이외는 table 생성시에 설정 불필요
  • Primary Key
    DynamoDB에서 Item을 고유하게 결정하는 키
    기본 키라고도하는 것 같다
  • Partition Key
    테이블 생성시 설정(필수)
    단독으로 Primary Key로 사용 가능
  • Sort Key
    테이블 생성시 설정
    Partition Key + Sort Key에서 Primary Key로 사용 가능
    Partition Key의 값이 동일하고 Sort Key의 값이 다른 경우 Partition Key + Sort Key로 Item을 고유하게 결정

  • Primary Key



    table 생성시 Primary Key를 이하 2패턴에서 선택
  • Partition Key
  • Partition Key + Sort Key

  • 1의 경우, Partition Key가 같은 데이터는 등록 불가
    2의 경우, Partition Key, Sort Key가 모두 같은 데이터는 등록 불가

    색인



    Key(Partition Key, Sort Key)로 설정한 것 이외의 attribute로 좁혀 검색(쿼리)을 실시하기 위해서,
    Partition Key, Sort Key를 다른 attribute로 설정한 것
    로컬 보조 인덱스 (LSI)와 글로벌 보조 인덱스 (GSI)의 두 가지 유형이 있습니다.

  • 로컬 보조 인덱스(LSI)

    아래와 같이 Sort Key만 다른 Attribute로 변경한 것

    ※Primary Key를 Partition Key + Sort Key로 한 경우에만 작성 가능
    ※LSI를 설정하는 경우, table 작성시에 설정할 필요가 있으며, 설정 방법은 후술

  • 글로벌 보조 인덱스(GSI)

    아래와 같이 Partition Key, Sort Key를 다른 attribute로 변경한 것


  • LSI 설정 방법



    아래와 같이 테이블 설정 열의 기본 설정 사용을 선택 취소하고 색인 추가를 클릭합니다.

    LSI로 설정하는 경우 파티션 키는 테이블의 파티션 키를 지정합니다.
    정렬 키로 필터링 검색에 사용할 속성을 설정하고 로컬 보조 인덱스로 만들기 확인


    GSI 설정 방법



    아래와 같이 색인 탭에서 색인 만들기를 클릭합니다.



    데이터 획득 패턴


  • getitem
    Primary Key를 사용한 검색
    검색할 수 있는 Item이 고유하게 결정되는 경우에만
  • query
    Primary Key = Partition Key + Sort Key 설정 시 Partition Key로 필터링 검색
    LSI, GSI에서 필터링 검색
  • scan (모든 레코드 획득)

  • 키 설정 및 데이터 획득 가능/불가




    키 설정
    스캔
    get item
    query


    Primary Key (Partition Key)


    ×

    Primary Key (Partition Key + Sort Key)




    LSI
    -
    -


    GSI
    -
    -



    boto3을 사용한 데이터 검색 예



    테이블 정의



    【테이블】
  • Primary Key
    Partition Key(SerialNumber) + Sort Key(BuildingId)


  • 【GSI】
  • Partition Key(Maker)


  • 데이터 취득 코드


    import boto3
    import json
    from boto3.dynamodb.conditions import Key, Attr
    
    dynamodb = boto3.resource("dynamodb", region_name='ap-northeast-1')
    table = dynamodb.Table("EdgeTable")
    
    # Primary Key(SerialNumber + BuildingId)を使用した検索
    def get_item(SerialNumber, BuildingId):
      response = table.get_item(
        Key={
          'SerialNumber': SerialNumber,
          'BuildingId': BuildingId
        }
      )
      return response['Item']
    
    # Partition Key(SerialNumber)での絞込検索
    def query_SerialNumber(SerialNumber):
      response = table.query(
        KeyConditionExpression=Key('SerialNumber').eq(SerialNumber)
      )
      return response['Items']
    
    # Partition Key + Sort Key(SerialNumber + BuildingId)での絞込検索
    def query_SerialNumber_BuildingId(SerialNumber, BuildingId):
      response = table.query(
        KeyConditionExpression=
          Key('SerialNumber').eq(SerialNumber) & Key('BuildingId').eq(BuildingId)
      )
      return response['Items']
    
    # GSI(Maker-index)のPartition Key(Maker)での絞込検索
    def query_Maker_index(Maker):
      response = table.query(
        IndexName='Maker-index',
        KeyConditionExpression=Key('Maker').eq(Maker)
      )
      return response['Items']
    
    
    response = get_item('abdc-000002', 'zyxw-00987')
    # response = {'BuildingId': 'zyxw-00987', 'DeviceType': '2', 'Maker': 'CCC', 'ProductionDate': '2019/10/2', 'SerialNumber': 'abdc-000002'}
    
    response = query_SerialNumber('abcd-000001')
    # response[0] = {'BuildingId': 'zyxw-12345', 'DeviceType': '1', 'LastMaintenanceDate': '2019/10/5', 'Maker': 'AAA', 'ProductionDate': '2015/10/1', 'SerialNumber': 'abcd-000001'}
    # response[1] = {'BuildingId': 'zyxw-12399', 'DeviceType': '5', 'Maker': 'BBB', 'ProductionDate': '2018/1/5', 'SerialNumber': 'abcd-000001'}
    
    response = query_SerialNumber_BuildingId('abcd-000001', 'zyxw-12399')
    # response[0] = [{'BuildingId': 'zyxw-12399', 'DeviceType': '5', 'Maker': 'BBB', 'ProductionDate': '2018/1/5', 'SerialNumber': 'abcd-000001'}]
    
    response = query_Maker_index('AAA')
    # response[0] = {'BuildingId': 'zyxw-12378', 'DeviceType': '3', 'LastMaintenanceDate': '2017/5/7', 'Maker': 'AAA', 'ProductionDate': '2012/4/5', 'SerialNumber': 'abcd-000003'}
    # response[1] = {'BuildingId': 'zyxw-12345', 'DeviceType': '1', 'LastMaintenanceDate': '2019/10/5', 'Maker': 'AAA', 'ProductionDate': '2015/10/1', 'SerialNumber': 'abcd-000001'}
    

    데이터 추가


    import boto3
    import json
    from boto3.dynamodb.conditions import Key, Attr
    
    dynamodb = boto3.resource("dynamodb", region_name='ap-northeast-1')
    table = dynamodb.Table("EdgeTable")
    
    def put_item():
      table.put_item(
          Item={
              'SerialNumber': 'abcd-000001',
              'BuildingId': 'zyxw-12399',
              'DeviceType': '5'
        }
      )
    

    참고



    htps : // 이 m / 우파 l에 ght / ms / 15367 또는 883 d4588c05
    htps // d1. 아 wss c. 이 m / 우비나 rs / jp / pdf / 세르 r / s / 20181225_ 아 WS-B ck belt_Dy도 DB. pdf

    좋은 웹페이지 즐겨찾기