Fitaru

Fitaru Database Schema

Rancangan schema database Supabase/PostgreSQL untuk mobile app dan admin CMS Fitaru.

52 dari 57 materi Project fitarudatabasesupabaseschema

Fitaru Database Schema

Dokumen ini menjelaskan struktur database MVP untuk aplikasi mobile Fitaru dan admin CMS.

Tujuan Schema

Schema ini dibuat agar Fitaru punya fondasi data yang rapi untuk:

  • Login dan profil user
  • Target diet user
  • Catatan makan
  • Catatan olahraga
  • Catatan berat badan
  • Catatan air minum
  • Konten tips
  • Database makanan
  • Database olahraga
  • Notifikasi
  • Feedback user
  • Admin CMS

Rekomendasi Database

Untuk MVP, rekomendasi terbaik:

Supabase PostgreSQL

Alasan:

  • Cocok untuk aplikasi mobile dan dashboard web admin
  • Auth sudah tersedia
  • Database relasional lebih enak untuk reporting
  • Bisa dipakai untuk CMS
  • Mudah dibuat API
  • Lebih fleksibel untuk analytics sederhana

Alternatif:

  • Firebase Firestore bila ingin cepat untuk mobile-only
  • PostgreSQL custom backend bila ingin kontrol penuh

Entity Relationship Overview

erDiagram
  users ||--|| user_profiles : has
  users ||--o{ meal_logs : creates
  users ||--o{ exercise_logs : creates
  users ||--o{ weight_logs : creates
  users ||--o{ water_logs : creates
  users ||--o{ feedback : sends
  users ||--o{ notification_deliveries : receives

  food_items ||--o{ meal_logs : referenced_by
  exercise_items ||--o{ exercise_logs : referenced_by

  content_categories ||--o{ articles : groups
  admin_users ||--o{ articles : writes
  notifications ||--o{ notification_deliveries : sends

Core Tables

1. users

Menyimpan akun utama user. Jika memakai Supabase Auth, table ini bisa mengikuti auth.users, lalu data tambahan disimpan di user_profiles.

Kolom:

ColumnTypeNotes
iduuidPrimary key
emailtextNullable jika login nomor HP
phonetextNullable
auth_providertextgoogle, apple, email, phone
statustextactive, suspended, deleted
created_attimestampTanggal daftar
updated_attimestampTanggal update

2. user_profiles

Menyimpan profil dan preferensi user.

Kolom:

ColumnTypeNotes
iduuidPrimary key
user_iduuidForeign key users.id
display_nametextNama panggilan
gendertextmale, female, other
birth_yearintUntuk menghitung usia
height_cmnumericTinggi badan
current_weight_kgnumericBerat terakhir
target_weight_kgnumericTarget berat
goaltextlose_weight, maintain_weight, gain_muscle, healthier
diet_styletextrelaxed, calorie_deficit, high_protein, low_sugar, low_fried, fasting, custom
activity_leveltextsedentary, light, active, very_active
timezonetextDefault Asia/Jakarta
created_attimestamp
updated_attimestamp

3. daily_targets

Menyimpan target harian user.

Kolom:

ColumnTypeNotes
iduuidPrimary key
user_iduuidForeign key users.id
water_glasses_targetintDefault 8
exercise_weekly_targetintDefault 3
calorie_targetintNullable untuk MVP
weigh_in_daystext[]Contoh: monday, thursday
is_calorie_tracking_enabledbooleanDefault false
created_attimestamp
updated_attimestamp

Activity Logs

4. meal_logs

Menyimpan catatan makan user.

Kolom:

ColumnTypeNotes
iduuidPrimary key
user_iduuidForeign key users.id
food_item_iduuidNullable, foreign key food_items.id
meal_timetextbreakfast, lunch, dinner, snack, drink
food_nametextInput manual user
portion_sizetextsmall, medium, large
estimated_caloriesintNullable
photo_urltextNullable
notetextNullable
logged_attimestampWaktu makan dicatat
created_attimestamp
updated_attimestamp

5. exercise_logs

Menyimpan catatan olahraga user.

Kolom:

ColumnTypeNotes
iduuidPrimary key
user_iduuidForeign key users.id
exercise_item_iduuidNullable, foreign key exercise_items.id
exercise_nametextInput manual user
duration_minutesintDurasi
intensitytextlight, medium, heavy
estimated_calories_burnedintNullable
notetextNullable
logged_attimestampWaktu olahraga
created_attimestamp
updated_attimestamp

6. weight_logs

Menyimpan riwayat berat badan.

Kolom:

ColumnTypeNotes
iduuidPrimary key
user_iduuidForeign key users.id
weight_kgnumericBerat
progress_photo_urltextNullable
notetextNullable
logged_attimestampWaktu timbang
created_attimestamp

7. water_logs

Menyimpan catatan air minum.

Kolom:

ColumnTypeNotes
iduuidPrimary key
user_iduuidForeign key users.id
glassesintJumlah gelas yang ditambahkan
logged_attimestampWaktu catat
created_attimestamp

Reference Data

8. food_items

Database referensi makanan yang dikelola admin CMS.

Kolom:

ColumnTypeNotes
iduuidPrimary key
nametextNama makanan
categorytexthomemade, outside_food, drink, snack, fruit, other
default_portiontextsmall, medium, large
calories_per_portionintEstimasi kalori
protein_gnumericNullable
carbs_gnumericNullable
fat_gnumericNullable
notestextNullable
statustextactive, inactive
created_byuuidForeign key admin_users.id
created_attimestamp
updated_attimestamp

9. exercise_items

Database referensi olahraga yang dikelola admin CMS.

Kolom:

ColumnTypeNotes
iduuidPrimary key
nametextNama olahraga
categorytextwalking, running, gym, home_workout, cycling, yoga, other
default_intensitytextlight, medium, heavy
default_duration_minutesintDefault durasi
calories_per_30_minutesintEstimasi
notestextNullable
statustextactive, inactive
created_byuuidForeign key admin_users.id
created_attimestamp
updated_attimestamp

Content CMS

10. content_categories

Kategori artikel tips.

Kolom:

ColumnTypeNotes
iduuidPrimary key
nametextNama kategori
slugtextUnique
descriptiontextNullable
statustextactive, inactive
created_attimestamp
updated_attimestamp

Kategori awal:

  • makan-santai
  • olahraga-pemula
  • kurangi-gula
  • meal-prep
  • tidur-recovery

11. articles

Artikel tips yang tampil di aplikasi.

Kolom:

ColumnTypeNotes
iduuidPrimary key
category_iduuidForeign key content_categories.id
titletextJudul
slugtextUnique
summarytextRingkasan pendek
contenttextIsi artikel
thumbnail_urltextNullable
statustextdraft, review, published, archived
author_iduuidForeign key admin_users.id
published_attimestampNullable
created_attimestamp
updated_attimestamp

Notifications

12. notifications

Campaign notifikasi dari admin CMS.

Kolom:

ColumnTypeNotes
iduuidPrimary key
titletextJudul notifikasi
messagetextIsi pesan
target_segmenttextall, active, inactive_7_days, lose_weight, no_meal_today
scheduled_attimestampNullable
sent_attimestampNullable
statustextdraft, scheduled, sent, cancelled
created_byuuidForeign key admin_users.id
created_attimestamp
updated_attimestamp

13. notification_deliveries

Riwayat pengiriman notifikasi per user.

Kolom:

ColumnTypeNotes
iduuidPrimary key
notification_iduuidForeign key notifications.id
user_iduuidForeign key users.id
delivery_statustextpending, sent, failed, opened
sent_attimestampNullable
opened_attimestampNullable
created_attimestamp

Feedback

14. feedback

Masukan user dari aplikasi mobile.

Kolom:

ColumnTypeNotes
iduuidPrimary key
user_iduuidForeign key users.id
typetextbug, suggestion, content_request, other
subjecttextJudul feedback
messagetextIsi feedback
statustextopen, reviewed, resolved, archived
admin_notetextNullable
created_attimestamp
updated_attimestamp

Admin CMS

15. admin_users

Admin yang bisa mengakses CMS.

Kolom:

ColumnTypeNotes
iduuidPrimary key
nametextNama admin
emailtextUnique
roletextsuper_admin, content_admin, support_admin
statustextactive, inactive
last_login_attimestampNullable
created_attimestamp
updated_attimestamp

16. audit_logs

Riwayat aktivitas admin penting.

Kolom:

ColumnTypeNotes
iduuidPrimary key
admin_user_iduuidForeign key admin_users.id
actiontextcreate, update, delete, publish, suspend
resource_typetextarticle, food_item, exercise_item, user, notification
resource_iduuidNullable
metadatajsonbDetail perubahan
created_attimestamp

Dashboard Queries

Mobile Dashboard

Data yang dibutuhkan:

  • Skor konsistensi hari ini
  • Jumlah meal log hari ini
  • Jumlah gelas air hari ini
  • Durasi olahraga hari ini
  • Berat terakhir
  • Perubahan berat mingguan
  • Timeline catatan hari ini

Query konseptual:

Get current user profile
Get daily target
Get meal_logs where logged_at is today
Get water_logs where logged_at is today
Get exercise_logs where logged_at is today
Get latest weight_log
Get weight_log from 7 days ago

Admin Overview Dashboard

Data yang dibutuhkan:

  • Total users
  • Active users today
  • New users this week
  • Meal logs today
  • Exercise logs today
  • Published tips
  • Pending feedback
  • Top foods this week
  • User growth chart

Query konseptual:

Count all active users
Count users active today from activity logs
Count meal_logs today
Count exercise_logs today
Count articles where status = published
Count feedback where status = open
Group meal_logs by food_name for top foods
Group users by created_at for growth chart

Index Recommendations

Index penting:

  • meal_logs(user_id, logged_at)
  • exercise_logs(user_id, logged_at)
  • weight_logs(user_id, logged_at)
  • water_logs(user_id, logged_at)
  • articles(status, published_at)
  • articles(slug)
  • food_items(name)
  • exercise_items(name)
  • feedback(status, created_at)
  • notifications(status, scheduled_at)

Row Level Security Notes

Jika memakai Supabase:

  • User hanya boleh membaca dan menulis log miliknya sendiri.
  • User hanya boleh membaca profil miliknya sendiri.
  • User boleh membaca artikel published.
  • User boleh membaca food_items dan exercise_items active.
  • Admin CMS memakai role khusus untuk mengelola konten dan data referensi.
  • Audit log hanya bisa dibaca Super Admin.

MVP Scope

Untuk MVP, yang wajib dibuat:

  1. users
  2. user_profiles
  3. daily_targets
  4. meal_logs
  5. exercise_logs
  6. weight_logs
  7. water_logs
  8. food_items
  9. exercise_items
  10. articles
  11. admin_users
  12. feedback

Yang bisa menyusul:

  1. notification_deliveries
  2. audit_logs
  3. macro nutrition detail
  4. advanced segmentation
  5. wearable integration

Tahap Berikutnya

Setelah schema ini, tahap berikutnya:

  1. Membuat SQL migration awal
  2. Menentukan API endpoint
  3. Membuat struktur project mobile dan admin web
  4. Membuat role dan permission admin
  5. Membuat backlog development MVP