don't use database directly