database abstraction