DatabaseSchema là một class tiện ích giúp quản lý tên bảng và cột trong Supabase, tránh lỗi typo khi query và đảm bảo consistency trong toàn bộ ứng dụng.
File database_schema.dart định nghĩa cấu trúc schema với các thành phần:
TableNames: Chứa tên các bảngCommonColumns: Chứa các cột phổ biến xuất hiện trong nhiều bảng- Class riêng cho từng bảng:
UsersTable,ProductsTable, v.v. StorageBuckets: Quản lý tên các bucket trong Supabase Storage
// Thay vì hardcode tên bảng
final products = await supabase.from('products').select();
// Sử dụng DatabaseSchema
final products = await supabase.from(DatabaseSchema.tables.products).select();// Thay vì hardcode tên cột
final availableProducts = await supabase
.from('products')
.select()
.eq('is_available', true);
// Sử dụng DatabaseSchema
final availableProducts = await supabase
.from(DatabaseSchema.tables.products)
.select()
.eq(DatabaseSchema.products.isAvailable, true);final response = await supabase
.from(DatabaseSchema.tables.products)
.select('*, ${DatabaseSchema.tables.categories}!inner(*)')
.eq('${DatabaseSchema.tables.categories}.${DatabaseSchema.categories.id}', categoryId);Ví dụ trong ProductRepository:
class ProductRepository {
final SupabaseClient _client = SupabaseClientService.instance;
final ProductsTable _schema = DatabaseSchema.products;
Future<List<Product>> getProductsByCategory(String categoryId) async {
final response = await _client
.from(_schema.table)
.select()
.eq(_schema.categoryId, categoryId);
return (response as List).map((item) => Product.fromJson(item)).toList();
}
}- Autocompletion trong IDE: Hỗ trợ gợi ý tên bảng, tên cột
- Kiểm tra lỗi typo khi biên dịch: Lỗi sẽ được phát hiện sớm
- Refactoring dễ dàng: Nếu cần đổi tên cột/bảng, chỉ cần thay đổi tại một nơi
- Code rõ ràng hơn: Các tên bảng/cột được tổ chức thành các nhóm logic
- Thêm tên bảng vào
TableNames - Tạo class mới tương ứng (ví dụ:
ReviewsTable) - Thêm instance của class đó vào
DatabaseSchema
// Thêm vào TableNames
final String reviews = 'product_reviews';
// Tạo class mới
class ReviewsTable {
const ReviewsTable();
final String table = 'product_reviews';
final String id = 'id';
final String productId = 'product_id';
// ...
}
// Thêm vào DatabaseSchema
static const ReviewsTable reviews = ReviewsTable();