sql >> Database teknologi >  >> RDS >> Mysql

Design af en opskriftsdatabase, der skal indeholde ingredienser såvel som underopskrifter

Det ser ud til, at du har brug for en databasemodel, der ligner denne:

Denne model har følgende egenskaber:

  • I bund og grund er hver opskrift en række trin.
  • Hvert trin har sin rækkefølge i forhold til andre trin i den samme opskrift (STEP_NO), en enhed (masse, volumen, antal...), en mængde i den pågældende enhed osv.
  • Et bestemt trin er forbundet enten til en ingrediens (når INGREDIENT_ID ikke er NULL) eller til en anden opskrift (når SUBRECIPE_ID ikke er NULL).
  • Udover det er STEP'et en ret standard junction-tabel, der implementerer mange-til-mange-forhold, hvilket betyder, at den samme ingrediens kan bruges i flere opskrifter (eller endda flere trin i den samme opskrift), og en opskrift kan også en "underopskrift" af flere andre opskrifter.
  • Dette er i bund og grund en rettet graf. Selve datamodellen forhindrer ikke cyklusser - de bør undgås på klientkodeniveau og muligvis detekteres af triggere.

Hvis MySQL understøttede CHECK-begrænsninger (hvilket det ikke gør ), kan du sikre dig, at den ene (men ikke begge) er ikke-NULL som denne:

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

Som det ser ud, skal du bruge en trigger til det.



  1. Hvad er præstationsforskellen i implementeringer af MySQL relationel division (IN OG i stedet for IN OR)?

  2. Sådan kontrolleres Oracle-databasen for langvarige forespørgsler

  3. Find rækker, der ikke indeholder numeriske data i Oracle

  4. PL/SQL-program til at slette posterne fra tabellen