Schema refactor — introduce Tracker, rename purchases to entries #31

Closed
opened 2026-05-01 21:31:34 +02:00 by myrmidex · 0 comments
Owner

Refactor the database schema to introduce Tracker and remove financial-specific naming.

Target schema

trackers:     id, user_id, asset_id (nullable), label, unit, price_tracking_enabled
entries:      id, tracker_id, quantity, unit_price (nullable), total_cost (nullable), date
milestones:   id, tracker_id, target, description
asset_prices: id, asset_id, price, date   ← unchanged
assets:       id, symbol, full_name       ← unchanged

Migration steps

  1. Create trackers table (user_id FK, asset_id nullable FK, label string, unit string, price_tracking_enabled bool default false)
  2. Rename purchasesentries
  3. Rename entries.sharesentries.quantity
  4. Rename entries.price_per_shareentries.unit_price
  5. Add entries.tracker_id FK, drop entries.asset_id (entries linked via tracker now)
  6. Add milestones.tracker_id FK
  7. Drop users.asset_id, users.price_tracking_enabled
  8. Data migration: for each existing user, create one tracker with their current asset_id, price_tracking_enabled, label = 'Portfolio', unit = 'shares'; backfill tracker_id on all entries and milestones

Design decisions

  • One tracker per user for now (User hasOne Tracker) — multi-tracker is a future milestone
  • No position column needed yet
  • asset_prices unchanged — shared market price per asset symbol
  • entries.unit_price = what user paid (broker price), distinct from asset_prices.price (market price)
Refactor the database schema to introduce Tracker and remove financial-specific naming. ## Target schema ``` trackers: id, user_id, asset_id (nullable), label, unit, price_tracking_enabled entries: id, tracker_id, quantity, unit_price (nullable), total_cost (nullable), date milestones: id, tracker_id, target, description asset_prices: id, asset_id, price, date ← unchanged assets: id, symbol, full_name ← unchanged ``` ## Migration steps 1. Create `trackers` table (user_id FK, asset_id nullable FK, label string, unit string, price_tracking_enabled bool default false) 2. Rename `purchases` → `entries` 3. Rename `entries.shares` → `entries.quantity` 4. Rename `entries.price_per_share` → `entries.unit_price` 5. Add `entries.tracker_id` FK, drop `entries.asset_id` (entries linked via tracker now) 6. Add `milestones.tracker_id` FK 7. Drop `users.asset_id`, `users.price_tracking_enabled` 8. Data migration: for each existing user, create one tracker with their current `asset_id`, `price_tracking_enabled`, `label = 'Portfolio'`, `unit = 'shares'`; backfill `tracker_id` on all entries and milestones ## Design decisions - One tracker per user for now (User hasOne Tracker) — multi-tracker is a future milestone - No `position` column needed yet - `asset_prices` unchanged — shared market price per asset symbol - `entries.unit_price` = what user paid (broker price), distinct from `asset_prices.price` (market price)
myrmidex added this to the v0.4.0 milestone 2026-05-01 21:31:34 +02:00
myrmidex added the
enhancement
label 2026-05-01 21:31:34 +02:00
myrmidex self-assigned this 2026-05-01 21:31:34 +02:00
myrmidex modified the milestone from v0.4.0 to v0.3.0 2026-05-02 16:19:28 +02:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lvl0/incr#31
No description provided.