> you have to write the whole file each time
Will not write the whole file. Instead each page of the database (default = 4KB) will be separate put.
The use case is: one-writer multiple readers.
The readers will read an old snapshot of the database (from s3) and writer will write to the active one. This way a lot of readers can open the DB in read-only mode.
As for writer, each page will be a separate put. The writes will be appended to a log(s) locally and the page will be synced in the background. This helps to exploit lot of parallel PUTs to S3. Once the sync happens the disk space for that page will be reclaimed.
For the writer:
v = open_new_version()
//inserts + updates
//commit
close_version(v)
For readers:
open_version_for_read(v)
//select