Architektonické inspirace a převzaté koncepty¶
Cílem není kopírovat konkrétní framework nebo databázový model. Cílem je převzít ověřené koncepty z moderních e-commerce systémů a přizpůsobit je vlastnímu provozu, importům, SEO, skladům a workflow.
Používáme:
- Vendure pro katalogovou a content architekturu
- Medusa pro pricing a inventory model
- Sylius hlavně pro Option vs Attribute
- Spree jako inspiraci pro REST API a některé e-commerce patterny
- Meilisearch jako search engine a indexační vrstvu
Nejde o vendor-lock. Model je navržen jako vlastní PostgreSQL-first architektura bez ORM závislosti.
Vendure — převzaté koncepty¶
Vendure je hlavní inspirace pro katalogovou vrstvu.
Product vs Variant¶
Vendure: - Product = katalogová entita - ProductVariant = prodejná jednotka
Převzato:
productproduct_variant
Produkt: - SEO - obsah - kategorizace - merchandising
Varianta: - SKU - EAN - sklad - cena - fyzická položka
Translation layer¶
Vendure používá oddělené translation tabulky.
Převzato:
product_translationbrand_translationcategory_translationcollection_translation
Výhody:
- žádné sloupce typu name_sk
- čisté lokalizace
- snadné přidání nového jazyka
Fallback řeší aplikace, ne databáze.
Collection koncept¶
Vendure: - Collections jako kurátorované nebo dynamické skupiny produktů
Převzato:
collectioncollection_product
Použití: - homepage - slider - landing pages - seasonal akce - merchandising
Search document¶
Vendure používá: - denormalizovaný search index
Převzato:
product_search_documentproduct_search_dirty
Důvod: - search nesmí dělat těžké JOINy - search engine dostává hotový dokument
Medusa — převzaté koncepty¶
Medusa je hlavní inspirace pro pricing a inventory.
Price set model¶
Medusa: - varianta nemá jednu cenu - má kontejner cen
Převzato:
price_setprice
Výhody: - regionální ceny - quantity pricing - akce - časová platnost - více typů cen
Výrazně lepší než:
- price_a
- price_b
- price_c
Inventory model¶
Medusa: - oddělení fyzického stocku od obchodní dostupnosti
Převzato:
inventory_iteminventory_levelsupplier_availabilityavailability_textinventory_reservation
Důležité: - fyzický stock != text pro zákazníka - rezervace != sklad - supplier stock != vlastní sklad
Reservation model¶
Medusa používá: - explicitní reservation records
Převzato:
inventory_reservation
Zdroj pravdy: - reservation tabulka
Optimalizace:
- reserved_quantity jako cache
Multi-location inventory¶
Medusa: - stock per location
Převzato:
stock_locationinventory_level
Výhody: - centrála - externí sklady - pickup pointy - budoucí expanze
Sylius — převzaté koncepty¶
Ze Sylius zůstává hlavně jeden velmi důležitý koncept.
Option vs Attribute¶
Převzato:
option_groupoption_valueattributeproduct_attribute_value
Rozdělení:
Option: - tvoří variantu/SKU - velikost - barva
Attribute: - pouze popisná vlastnost - materiál - výkon - váha
Tím se řeší historický chaos: - varianty - barvy - parametry - technické údaje
Co ze Sylius nepřebíráme¶
Nepřebíráme: - Doctrine-heavy architekturu - entity graph model - plugin ecosystem - ORM-first přístup
Architektura je: - SQL-first - PostgreSQL-first - bez ORM závislosti
Spree — převzaté koncepty¶
Spree je inspirace hlavně pro REST API přístup a některé e-commerce patterny.
REST API styl¶
API bude: - resource-oriented - predictable - explicitní - bez magických ORM response struktur
Inspirace: - Spree API - Stripe API - Medusa API styl
Například:
/products/products/{id}/products/{id}/variants/collections/categories/cart/orders
Oddělení katalogu a objednávek¶
Spree historicky dobře odděluje: - katalog - checkout - order processing
Tento princip zůstává zachován.
Promotion patterny¶
Spree: - promotions jako samostatná pravidla
Převzato:
promotionpromotion_productpromotion_brandpromotion_category
Meilisearch — search architektura¶
Meilisearch není zdroj pravdy.
Zdroj pravdy: - PostgreSQL
Meilisearch: - pouze index a search engine
Search dokument¶
Search engine dostává: - denormalizovaný dokument
Převzato:
product_search_document
Obsahuje: - text - cenu - sklad - facety - kategorii - značku - SEO data
Bez JOINů při search query.
Async indexing¶
Search sync je asynchronní.
Převzato:
product_search_dirty
Trigger: - pouze označí dirty stav
Worker: - rebuildne dokument - odešle do Meilisearch
Facety¶
Facety nevznikají samostatnou DB vrstvou.
Generují se:
- z product_attribute_value
- při tvorbě search dokumentu
Tím: - databáze zůstává jednodušší - search engine dostává hotové facety
Celková architektonická filozofie¶
Architektura je:
- PostgreSQL-first
- SQL-first
- bez ORM závislosti
- explicitní
- auditovatelná
- import-friendly
- search-first
- async-first
Databáze není jen úložiště.
Databáze řeší: - konzistenci - inventory - pricing - strom kategorií - constrainty - audit - procedury - snapshoty
Aplikace řeší: - orchestrace - workflow - API - UI - integrace - search sync - business procesy
Co záměrně NEkopírujeme¶
Záměrně nepřebíráme:
- ORM-heavy architektury
- ActiveRecord styl
- magické entity graphy
- plugin spaghetti
- framework coupling
- business logiku schovanou v ORM
Cíl: - jednoduché SQL - čitelný model - kontrola nad query - vysoká auditovatelnost - dlouhodobě udržitelná architektura