Seed provenance + inventory: source links and seed lots (#50) (#64)
Build image / build-and-push (push) Successful in 8s
Build image / build-and-push (push) Successful in 8s
Co-authored-by: Steve Dudenhoeffer <[email protected]>
This commit was merged in pull request #64.
This commit is contained in:
@@ -0,0 +1,53 @@
|
||||
-- Seed provenance and inventory (#50): where "German Red Garlic" came from, and
|
||||
-- how much of it is left.
|
||||
--
|
||||
-- Two modelling calls worth stating, because both look like omissions otherwise:
|
||||
--
|
||||
-- 1. The plant catalog stays FLAT. No species→variety hierarchy. A row in your
|
||||
-- catalog just is the thing you plant — "German Red Garlic" is a plant row,
|
||||
-- and the built-in "Garlic" is a generic starting point you clone. A
|
||||
-- hierarchy buys taxonomy nobody asked for and complicates every join.
|
||||
--
|
||||
-- 2. Inventory belongs to a PURCHASE, not to a variety. You might buy the same
|
||||
-- garlic from two vendors in two years at two prices and two germination
|
||||
-- rates. Quantity columns on plants would collapse all of that into one
|
||||
-- number and lose it, so lots get their own table.
|
||||
--
|
||||
-- Nothing here is destructive: plants gains two defaulted columns, the built-ins
|
||||
-- keep working with empty strings, and plantings gains a nullable link.
|
||||
ALTER TABLE plants ADD COLUMN source_url TEXT NOT NULL DEFAULT '';
|
||||
ALTER TABLE plants ADD COLUMN vendor TEXT NOT NULL DEFAULT '';
|
||||
|
||||
-- owner_id sits on the LOT rather than being inherited from the plant, because a
|
||||
-- lot may reference a built-in plant (you can buy generic Garlic from Johnny's)
|
||||
-- while still being nobody's business but yours. Lots are never shared along
|
||||
-- with a garden.
|
||||
CREATE TABLE seed_lots (
|
||||
id INTEGER PRIMARY KEY,
|
||||
owner_id INTEGER NOT NULL REFERENCES users (id) ON DELETE CASCADE,
|
||||
plant_id INTEGER NOT NULL REFERENCES plants (id) ON DELETE CASCADE,
|
||||
vendor TEXT NOT NULL DEFAULT '',
|
||||
source_url TEXT NOT NULL DEFAULT '',
|
||||
sku TEXT NOT NULL DEFAULT '',
|
||||
lot_code TEXT NOT NULL DEFAULT '',
|
||||
purchased_at TEXT, -- 'YYYY-MM-DD'
|
||||
packed_for_year INTEGER,
|
||||
quantity REAL NOT NULL DEFAULT 0,
|
||||
unit TEXT NOT NULL CHECK (unit IN ('seeds','grams','ounces','packets','bulbs','plants')),
|
||||
cost_cents INTEGER,
|
||||
germination_pct REAL,
|
||||
notes TEXT NOT NULL DEFAULT '',
|
||||
version INTEGER NOT NULL DEFAULT 1,
|
||||
created_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now')),
|
||||
updated_at TEXT NOT NULL DEFAULT (strftime('%Y-%m-%dT%H:%M:%SZ', 'now'))
|
||||
);
|
||||
|
||||
CREATE INDEX idx_seed_lots_owner ON seed_lots (owner_id);
|
||||
CREATE INDEX idx_seed_lots_plant ON seed_lots (plant_id);
|
||||
|
||||
-- Which lot a planting came out of. ON DELETE SET NULL rather than CASCADE:
|
||||
-- retiring a lot must never destroy planting history — the plants really were in
|
||||
-- the ground, whatever happened to the record of the packet.
|
||||
ALTER TABLE plantings ADD COLUMN seed_lot_id INTEGER REFERENCES seed_lots (id) ON DELETE SET NULL;
|
||||
|
||||
CREATE INDEX idx_plantings_seed_lot ON plantings (seed_lot_id) WHERE seed_lot_id IS NOT NULL;
|
||||
Reference in New Issue
Block a user