Difference between revisions of "Dynamodb"

From John Freier
Jump to: navigation, search
Line 12: Line 12:
 
If more sorting is required, take a look at using Local Global Index.
 
If more sorting is required, take a look at using Local Global Index.
  
== Secondary Global Index ==
+
== Global Secondary Index ==
 
This allows you to create a super table from the base table, to allow for different keys and sorting when using the `query` command.
 
This allows you to create a super table from the base table, to allow for different keys and sorting when using the `query` command.
  
Line 99: Line 99:
  
  
== Local Global Index ==
+
== Local Secondary Index ==
Local global index, creates a super table on top of the base table to allow for more sorting abilities.
+
This creates a super table on top of the base table to allow for more sorting abilities only.
 +
 
 +
Example
 +
  var AWS = require("aws-sdk");
 +
  AWS.config.update({
 +
      region: "local",
 +
      endpoint: "http://localhost:8000"
 +
  });
 +
  var dynamodb = new AWS.DynamoDB();
 +
  var params = {
 +
      TableName: "statements",
 +
      AttributeDefinitions: [{    // Attributes are the items that are used in the key definitions and GSI/LSI.
 +
              AttributeName: "id",
 +
              AttributeType: "S"  // S - String
 +
          },
 +
          {
 +
              AttributeName: "time",
 +
              AttributeType: "N"  // N - Number
 +
          },
 +
          {
 +
              AttributeName: "userId",
 +
              AttributeType: "S"
 +
          }
 +
      ],
 +
      KeySchema: [{
 +
              AttributeName: "id",
 +
              KeyType: "HASH"
 +
          }, //Partition key
 +
          {
 +
              AttributeName: "userId",
 +
              KeyType: "RANGE"
 +
          }, //Sort key
 +
      ],
 +
      LocalSecondaryIndexes: [{
 +
          IndexName: 'statement_user_index',
 +
          KeySchema: [{
 +
                  AttributeName: "id",  // Must have the same key as the base.
 +
                  KeyType: "HASH"
 +
              },
 +
              {
 +
                  AttributeName: 'time',  // This is the secondary sort key.
 +
                  KeyType: 'RANGE',
 +
              }
 +
          ],
 +
          Projection: {
 +
              ProjectionType: 'ALL'    // KEY_ONLY, INCLUDE, ALL - This holds the columns that are used in the GSI and returned when queried.
 +
          },
 +
          ProvisionedThroughput: {
 +
              WriteCapacityUnits: 5,
 +
              ReadCapacityUnits: 5
 +
          }
 +
      }],
 +
      ProvisionedThroughput: {
 +
          ReadCapacityUnits: 5,
 +
          WriteCapacityUnits: 5
 +
      }
 +
  };
 +
  dynamodb.createTable(params, function(err, data) {
 +
      if (err) {
 +
          console.error("Unable to create table. Error JSON:", JSON.stringify(err, null, 2));
 +
      } else {
 +
          console.log("Created table. Table description JSON:", JSON.stringify(data, null, 2));
 +
      }
 +
  });

Revision as of 13:07, 5 January 2023

DynamoDB is an AWS product that has a stand alone app for development but is really suppose to be built out in AWS where they handle the administration/OPS.

This is a NoSQL database.

Partition Key and Sort Key

There are two types of keys that can be used to define a primary key.

Partition keys are the how the database separates data in the backend.

Sort keys allow you to sort data by a secondary column.

If more sorting is required, take a look at using Local Global Index.

Global Secondary Index

This allows you to create a super table from the base table, to allow for different keys and sorting when using the `query` command.

Example

 var AWS = require("aws-sdk");
 AWS.config.update({
     region: "local",
     endpoint: "http://localhost:8000"
 });
 var dynamodb = new AWS.DynamoDB();
 var params = {
     TableName: "statements",
     AttributeDefinitions: [{     // Attributes are the items that are used in the key definitions and GSI/LSI.
             AttributeName: "id",
             AttributeType: "S"   // S - String
         },
         {
             AttributeName: "time",
             AttributeType: "N"   // N - Number
         },
         {
             AttributeName: "userId",
             AttributeType: "S"
         }
     ],
     KeySchema: [{
             AttributeName: "id",
             KeyType: "HASH"
         }, //Partition key
         {
             AttributeName: "userId",
             KeyType: "RANGE"
         }, //Sort key 
     ],
     GlobalSecondaryIndexes: [{
         IndexName: 'statement_user_index',
         KeySchema: [{
                 AttributeName: 'userId',
                 KeyType: 'HASH',
             },
             {
                 AttributeName: 'time',
                 KeyType: 'RANGE',
             }
         ],
         Projection: {
             ProjectionType: 'ALL'    // KEY_ONLY, INCLUDE, ALL - This holds the columns that are used in the GSI and returned when queried.
         },
         ProvisionedThroughput: {
             WriteCapacityUnits: 5,
             ReadCapacityUnits: 5
         }
     }],
     ProvisionedThroughput: {
         ReadCapacityUnits: 5,
         WriteCapacityUnits: 5
     }
 };
 dynamodb.createTable(params, function(err, data) {
     if (err) {
         console.error("Unable to create table. Error JSON:", JSON.stringify(err, null, 2));
     } else {
         console.log("Created table. Table description JSON:", JSON.stringify(data, null, 2));
     }
 });


Example query

   this.findLatest = async function(table, userId) {
       var params = {
           TableName: table,
           IndexName: 'statement_user_index',     // Must have the indexName too query against an GSI index.
           KeyConditionExpression: 'userId = :userId',   // Must contain the key
           ExpressionAttributeValues: { ':userId': userId },  // Used like prepared statements.
           Limit: 1,  // Number of results returned (optional)
           ScanIndexForward: false  // Ascending or Descending. (Optional)
       };
       try {
           const results = await docClient.query(params).promise();
           return results.Items;
       } catch (err) {
           console.log(err);
           throw err;
       };
   }


Local Secondary Index

This creates a super table on top of the base table to allow for more sorting abilities only.

Example

 var AWS = require("aws-sdk");
 AWS.config.update({
     region: "local",
     endpoint: "http://localhost:8000"
 });
 var dynamodb = new AWS.DynamoDB();
 var params = {
     TableName: "statements",
     AttributeDefinitions: [{     // Attributes are the items that are used in the key definitions and GSI/LSI.
             AttributeName: "id",
             AttributeType: "S"   // S - String
         },
         {
             AttributeName: "time",
             AttributeType: "N"   // N - Number
         },
         {
             AttributeName: "userId",
             AttributeType: "S"
         }
     ],
     KeySchema: [{
             AttributeName: "id",
             KeyType: "HASH"
         }, //Partition key
         {
             AttributeName: "userId",
             KeyType: "RANGE"
         }, //Sort key 
     ],
     LocalSecondaryIndexes: [{
         IndexName: 'statement_user_index',
         KeySchema: [{
                 AttributeName: "id",   // Must have the same key as the base.
                 KeyType: "HASH"
             },
             {
                 AttributeName: 'time',  // This is the secondary sort key.
                 KeyType: 'RANGE',
             }
         ],
         Projection: {
             ProjectionType: 'ALL'    // KEY_ONLY, INCLUDE, ALL - This holds the columns that are used in the GSI and returned when queried.
         },
         ProvisionedThroughput: {
             WriteCapacityUnits: 5,
             ReadCapacityUnits: 5
         }
     }],
     ProvisionedThroughput: {
         ReadCapacityUnits: 5,
         WriteCapacityUnits: 5
     }
 };
 dynamodb.createTable(params, function(err, data) {
     if (err) {
         console.error("Unable to create table. Error JSON:", JSON.stringify(err, null, 2));
     } else {
         console.log("Created table. Table description JSON:", JSON.stringify(data, null, 2));
     }
 });