add data persistent layer, decouple datastore