我认为 S3 和 JSON 可以继续很好地为您工作,而无需使用完整的关系数据库系统。
如果您以关系形式设想您的解决方案,您可以通过将表映射到 S3 中的目录、将行映射到 S3 中的单个文件以及每行中的列值作为存储在该文件中的 JSON 结构来将其转换为 S3 表示。在每个“行”= S3 文件中存储少量数据可让您轻松更新数据。由于向 S3 的传输要么成功,要么完全失败,您的更新将保持一致。
要了解表中有多少行,您将使用 S3 列表功能列出具有该表的公共前缀的文件。
S3 控制台使您能够查看和探索您的文件结构。
Amazon IAM 可以提供安全性。
可以通过使用生命周期规则复制到 Amazon Glacier 来完成自动备份。
如果您使用这种方法,您将获得许多类似关系的功能,但不会产生运行 EC2 服务器或使用 Amazon RDS 的额外费用和复杂性。
最后,对这一切进行编程很简单,因为您已经拥有了之前工作中的工具。我怀疑你会有这样的包来在 S3 上执行所有必要的操作:
//---------------------------------------------------------------------
// Amazon S3
//---------------------------------------------------------------------
class S3 extends AmazonS3Client
{final String bucket;
S3(String u, String p, String Bucket)
{super(new BasicAWSCredentials(u, p));
bucket = Bucket;
}
boolean put(String k, String v)
{try
{final ByteArrayInputStream b = new ByteArrayInputStream(v.toString().getBytes());
putObject(bucket, k, b, new ObjectMetadata());
setObjectAcl(bucket, k, CannedAccessControlList.PublicRead); // Has to be here to allow change to reduced redundancy
changeObjectStorageClass(bucket, k, StorageClass.ReducedRedundancy);
setObjectAcl(bucket, k, CannedAccessControlList.PublicRead); // Has to be repeated because it is now a new object again
return true;
}
catch(Exception e) {log("Cannot put "+bucket+"/"+k+" to S3 because "+e);}
return false;
}
String get(String k)
{try
{final S3Object f = getObject(bucket, k);
final BufferedInputStream i = new BufferedInputStream(f.getObjectContent());
final StringBuilder s = new StringBuilder();
final byte[]b = new byte[1024];
for(int n = i.read(b); n != -1; n = i.read(b)) {s.append(new String(b, 0, n));}
return s.toString();
}
catch(Exception e) {log("Cannot get "+bucket+"/"+k+" from S3 because "+e);}
return null;
}
String[]list(String d)
{try
{final ObjectListing l = listObjects(bucket, d);
final List<S3ObjectSummary> L = l.getObjectSummaries();
final int n = L.size();
final String[]s = new String[n];
for(int i = 0; i < n; ++i)
{final S3ObjectSummary k = L.get(i);
s[i] = k.getKey();
}
return s;
}
catch(Exception e) {log("Cannot list "+bucket+"/"+d+" on S3 because "+e);}
return new String[]{};
}
}
}