Skip to content
Advertisement

Advice on database design – SQL recipe editor

I want to build an SQL-based recipe editor for a brewery. I have n recipes:

  • Every recipe is part of a category.
  • Every category has a list of steps.
  • Steps can be reused in the same category several times and in different orders.
  • Every step has n set-points.
  • Setpoints change based on the recipe.
  • The same steps used more than once in the same category could have different setpoints within the same recipe.

I have 3 recipes (BeerA, BeerB and BeerC):

  • BeerA and BeerB are lager (category), while BeerC is a stout (category).
  • Lager has 5 steps
    (start, fermentation, wait, fermentation, maturation).
  • All the steps have 2 set-points
    (time, temperature).

BeerA specific set-points could be:

  • Start:
    [10seconds, 30 degrees]
  • Fermentation:
    [2 days, 27 degrees]
  • Wait:
    [3 hours, 25 degrees]
  • Fermentation:
    [3 days, 23 degrees]
  • Maturation:
    [5 days, 3 degrees]

BeerB has the same steps, same order, but with different set-points. BeerC has only 3 steps. What would be an example of table design? I was thinking:

  • Recipe table
    (RecipeID, RecipeName, categoryID).
  • Category table
    (CategoryID, CategoryName).
  • Steps table (I need the reference to the category and to the recipe).

How can I deal with steps using different set-points? I believe I need also a Setpoints table, but how to design it?

Advertisement

Answer

-- Beer category BCT exists.
--
category {BCT}
      PK {BCT}
-- Brewing step STP exists
--
step {STP}
  PK {STP}
-- Step sequence number ST# for brewing beer
-- of category BCT is step STP.
--
cat_step {BCT, ST#, STP}
      PK {BCT, ST#}

FK1 {BCT} REFERENCES category {BCT}
FK2 {STP} REFERENCES step     {STP}


-- Note: ST# in [1,2,3 ..]
-- Beer BER is of beer category BCT.
--
beer {BER, BCT}
  PK {BER}
  SK {BER, BCT}

FK {BCT} REFERENCES category {BCT}
-- Step sequence number ST# of recipe
-- for brewing beer BER of beer category BCT
-- is at temperature TMP deg, for TIM minutes.
--
recipe {BER, BCT, ST#, TIM, TMP}
    PK {BER, ST#}

FK1 {BER, BCT} REFERENCES beer     {BER, BCT}
FK2 {BCT, ST#} REFERENCES cat_step {BCT, ST#}

Note:

All attributes (columns) NOT NULL

PK = Primary Key
AK = Alternate Key   (Unique)
SK = Proper Superkey (Unique)
FK = Foreign Key
Using suffix # to save on screen space.
OK for SQL Server and Oracle, for others use _NO.
For example, rename OPT# to OPT_NO.
User contributions licensed under: CC BY-SA
2 People found this is helpful
Advertisement