sql >> Databáze >  >> RDS >> Mysql

Navrhování databáze receptů, která musí zahrnovat přísady i dílčí receptury

Vypadá to, že potřebujete databázový model podobný tomuto:

Tento model má následující vlastnosti:

  • Každý recept je v podstatě série kroků.
  • Každý krok má své pořadí vzhledem k ostatním krokům stejného receptu (STEP_NO), jednotku (hmotnost, objem, počet...), množství v dané jednotce atd.
  • Konkrétní krok je spojen buď s přísadou (když INGREDIENT_ID nemá hodnotu NULL), nebo s jiným receptem (když SUBRECIPE_ID není s hodnotou NULL).
  • Kromě toho je STEP poměrně standardní spojovací tabulkou implementující vztah many-to-many, což znamená, že stejnou přísadu lze použít ve více receptech (nebo dokonce ve více krocích stejného receptu) a také lze recept „dílčí recept“ z mnoha dalších receptů.
  • Toto je v podstatě orientovaný graf. Datový model sám o sobě nezabrání cyklům – je třeba se jim vyhnout na úrovni klientského kódu a případně je detekovat spouštěče.

Pokud MySQL podporuje omezení CHECK (což ne ), můžete zajistit, že jeden (ale ne oba) z nich nebude NULL takto:

CHECK (
    (INGREDIENT_ID IS NULL AND SUBRECIPE_ID IS NOT NULL)
    OR (INGREDIENT_ID IS NOT NULL AND SUBRECIPE_ID IS NULL)
)

Ve stávající podobě k tomu budete potřebovat spoušť.



  1. MYSQLI - WHERE IN pole

  2. získání syntaktické chyby při vytváření funkce

  3. Žádná taková výjimka sloupce sqlite

  4. Tipy pro zámky čtení/zápisu v závislosti na úrovni izolace transakcí v MSSQL