DynamoDB was designed to fit Amazon’s pricing model.
In other words, the primary architecture goal of DynamoDB is to charge you for data storage and transfer. So it was designed to force you to scan the whole table for every item of data, and to put every attribute in every record.
Some clever people have discovered ways to (sort of) make it work for simple scenarios using GSIs and LSIs, but Amazon’s response was to charge you for using them and limit how much you can use them.
If you want to find a piece of data in DynamoDB without scanning the whole table, you have to copy the whole table to create an index (GSI) — and then be charged for querying (and storing) both tables. And you’re only allowed to have 20 GSIs per table.
By the way, you cannot relate data between tables in DynamoDB, so you have to have all data for your entire application is a single table (or else download the full contents of each table and do the comparison by scanning the full contents of each table in your own code — hopefully using EC2). That means for your entire application, you can only have 20 relations. And that’s not relations between 20 attributes. If you want to look up information where 4 different attributes relate to each other, that’s 11 out of 20 permutations right there. And 11 copies of the full table, just to be able to index and them and search. If you need 5, that’s 26 relations — you can’t have that many.
If you want to have a Local Sort Index (and avoid copying the full table), well, you’re only allowed 3, and you must define it at table creation time. How can you know that up front? Don’t worry, Amazon recommends destroying and recreating your table (more data transfer costs) once you need a relation.
Transactions are possible, but are also limited, and charged.
But it’s not the annoying copying, rebuilding, and miscellaneous costs that Amazon is going for. What they really hope is that you live with the initial design, and need to scan the entire table on every query, so they can charge you for “usage”.
So, if you have a very simple application, that will never increase in complexity or size, and you can always look up records by ID or will always was to download the whole data set to load into application memory, DynamoDB may be a solution you can use. Or a CSV file.
