MENU
Database Types
AWS offers several categories of database service, each optimized for a different data model and access pattern. Choosing the right category for an application's data model is the first decision when designing a database solution on AWS. In summary:- Aurora — joins and complex ACID-compliant operations on structured relational data.
- DocumentDB — JSON data with ease (MongoDB-compatible).
- DynamoDB — simple key-value data structures.
- DAX — very fast response times layered in front of DynamoDB.
- ElastiCache — fast response times using Redis or Memcached.
- Neptune — graph data, e.g. product recommendations, social networking, fraud detection.
- QLDB — tamper-proof data, e.g. financial transactions, supply chain management.
- Non-Aurora RDS — compatibility with an existing relational engine (MySQL, PostgreSQL, Oracle, MariaDB).
- Redshift — complex analytical queries over very large (petabyte/exabyte-scale) data sets.
- Timestream — time-series data, e.g. stock prices.
The subsections below describe each category of database available on AWS and when to select it.
Relational Databases
Relational databases are organized around a relational data model and use SQL for querying data. They are a good choice for applications that require ACID compliance, strong data consistency, and support for complex queries. Examples on AWS include Amazon RDS for MySQL, PostgreSQL, and Oracle, as well as Amazon Aurora. See Essential Concepts for a general introduction to relational database concepts.Key-value Databases
Key-value databases store data in a simple key-value format and are optimized for high performance and scalability. They suit applications that require high read/write throughput, low latency, and simple data models. Examples on AWS include Amazon DynamoDB and Amazon ElastiCache with Memcached.Document Databases
Document databases store data as semi-structured or unstructured documents and are optimized for flexibility and scalability. They suit applications that require dynamic, schema-less data models and support for nested data structures. Examples on AWS include Amazon DocumentDB (with MongoDB compatibility) and MongoDB Atlas. Compare this with MySQL's native JSON support for storing semi-structured data inside a relational schema.In-memory Databases
In-memory databases store data entirely in memory and are optimized for high performance and low latency. They suit applications that require fast access to frequently accessed data, such as real-time analytics or caching. Examples on AWS include Amazon ElastiCache with Redis and Memcached.Graph Databases
Graph databases store data as nodes and edges and are optimized for complex relationship mapping. They suit applications that require support for highly connected data, such as social networks, recommendation engines, and fraud detection. Examples on AWS include Amazon Neptune and Neo4j.Time-series Databases
Time-series databases store data as a series of timestamped values and are optimized for handling large amounts of time-series data. They suit applications that require high performance and scalability for time-series data, such as IoT and log data. Examples on AWS include Amazon Timestream and InfluxDB. See also Date and Time for MySQL's temporal data types and functions.Ledger Databases
Ledger databases provide an immutable, tamper-proof ledger of all transactions in an application. They suit applications that require a transparent and secure audit trail, such as financial services and supply chain management. The example on AWS is Amazon Quantum Ledger Database (QLDB).# List the relational database engines and versions available through
# Amazon RDS, to help decide which relational option fits an application
# that needs an existing engine's compatibility (see "Non-Aurora RDS" above)
aws rds describe-db-engine-versions \
--engine mysql \
--query "DBEngineVersions[].EngineVersion" \
--output table
# Compare against Aurora MySQL-Compatible Edition versions
aws rds describe-db-engine-versions \
--engine aurora-mysql \
--query "DBEngineVersions[].EngineVersion" \
--output table