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_closure se nemá zapisovat ručně.
  • Přesuny a rebuild stromu patří do DB procedur.

Pricing

  • Do pricing.price se nemá běžně vkládat přímým INSERT.
  • Kolidující cenové intervaly má řešit procedura pricing.price_upsert().

Inventory

  • inventory_reservation je zdroj pravdy pro rezervace.
  • inventory_level.reserved_quantity je cache udržovaná triggerem.
  • Fyzický stock a text dostupnosti nejsou totéž.
  • Vyhledávání nemá skládat online složité JOINy.
  • Produkt se po změně označí jako dirty a worker připraví nový search dokument.