关于数据库设计的建议 - SQL 食谱编辑器
Advice on database design - SQL recipe editor
我想为啤酒厂构建一个基于 SQL 的配方编辑器。我有 n 个食谱:
- 每个食谱都是一个类别的一部分。
- 每个类别都有一个步骤列表。
- 步骤可以在同一类别中以不同的顺序重复使用多次。
- 每一步都有 n 个设定点。
- 设定值根据配方变化。
- 在同一类别中多次使用的相同步骤在同一配方中可能具有不同的设定值。
我有 3 个食谱(BeerA、BeerB 和 BeerC):
- BeerA 和 BeerB 是贮藏啤酒(类别),而 BeerC 是黑啤酒(类别)。
- 拉格啤酒有 5 个步骤
(开始、发酵、等待、发酵、成熟)。
- 所有步骤都有 2 个设定点
(时间、温度)。
BeerA 具体设定点可以是:
- 开始:
[10秒,30度]
- 发酵:
[2天,27度]
- 等待:
[3 小时,25 度]
- 发酵:
[3天,23度]
- 成熟度:
[5天,3度]
BeerB 具有相同的步骤、相同的顺序,但设置点不同。 BeerC 只有 3 个步骤。 table 设计的例子是什么?我在想:
- 食谱table
(RecipeID, RecipeName, categoryID)。
- 类别table
(CategoryID, CategoryName)。
- 步骤 table(我需要类别和食谱的参考)。
如何处理使用不同设定点的步骤?我相信我还需要一个设定点 table,但如何设计它?
你所描述的是一个合理的起点;我会有一个“啤酒”实体,让您可以保存有关啤酒的信息,而且我还会对食谱进行某种版本控制(或 start/end 日期)——以防它发生变化。
所以像这样(只是一个例子,并不意味着是一个确定的模型):
-- 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#}
注:
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.
我想为啤酒厂构建一个基于 SQL 的配方编辑器。我有 n 个食谱:
- 每个食谱都是一个类别的一部分。
- 每个类别都有一个步骤列表。
- 步骤可以在同一类别中以不同的顺序重复使用多次。
- 每一步都有 n 个设定点。
- 设定值根据配方变化。
- 在同一类别中多次使用的相同步骤在同一配方中可能具有不同的设定值。
我有 3 个食谱(BeerA、BeerB 和 BeerC):
- BeerA 和 BeerB 是贮藏啤酒(类别),而 BeerC 是黑啤酒(类别)。
- 拉格啤酒有 5 个步骤
(开始、发酵、等待、发酵、成熟)。 - 所有步骤都有 2 个设定点
(时间、温度)。
BeerA 具体设定点可以是:
- 开始:
[10秒,30度] - 发酵:
[2天,27度] - 等待:
[3 小时,25 度] - 发酵:
[3天,23度] - 成熟度:
[5天,3度]
BeerB 具有相同的步骤、相同的顺序,但设置点不同。 BeerC 只有 3 个步骤。 table 设计的例子是什么?我在想:
- 食谱table
(RecipeID, RecipeName, categoryID)。 - 类别table
(CategoryID, CategoryName)。 - 步骤 table(我需要类别和食谱的参考)。
如何处理使用不同设定点的步骤?我相信我还需要一个设定点 table,但如何设计它?
你所描述的是一个合理的起点;我会有一个“啤酒”实体,让您可以保存有关啤酒的信息,而且我还会对食谱进行某种版本控制(或 start/end 日期)——以防它发生变化。
所以像这样(只是一个例子,并不意味着是一个确定的模型):
-- 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#}
注:
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.