Doména a pravidla¶
Základní návrhová rozhodnutí¶
Projekt staví na několika pevných pravidlech:
- produkt je kotva katalogu, ne kontejner všeho,
- varianta je prodejní jednotka,
- texty jsou oddělené v translation tabulkách,
- ceny jsou oddělené od katalogu,
- sklad a dostupnost jsou oddělené od cen i od produktu,
- search má vlastní denormalizovanou vrstvu,
- některé kritické operace hlídá databáze procedurami a triggery.
Proč je model rozdělený do domén¶
Kdyby se cena, sklad, popis a importní metadata míchaly do jedné tabulky, vznikaly by:
- těžko udržovatelné importy,
- komplikované lokalizace,
- nekontrolované vedlejší efekty při změně dat,
- složité dotazy pro API i search.
Rozdělení do domén zmenšuje coupling a zpřesňuje zodpovědnost každé části systému.
Důležitá business pravidla¶
Produkt vs. varianta¶
- Produkt reprezentuje katalogovou položku.
- Varianta reprezentuje prodejnou položku.
- Sklad, cena a část dostupnosti se navazují primárně na variantu.
Lokalizace¶
- Fallback lokalizace řeší aplikace, ne databáze.
- Pokud překlad pro daný locale neexistuje, API může vrátit
null.
Kategorie¶
- Strom kategorií používá closure table.
- Do
content.category_closurese nemá zapisovat ručně. - Přesuny a rebuild stromu patří do DB procedur.
Pricing¶
- Do
pricing.pricese nemá běžně vkládat přímýmINSERT. - Kolidující cenové intervaly má řešit procedura
pricing.price_upsert().
Inventory¶
inventory_reservationje zdroj pravdy pro rezervace.inventory_level.reserved_quantityje cache udržovaná triggerem.- Fyzický stock a text dostupnosti nejsou totéž.
Search¶
- Vyhledávání nemá skládat online složité JOINy.
- Produkt se po změně označí jako
dirtya worker připraví nový search dokument.