我认为您正在寻找一些相关的表格。
我建议使用釉基表,其中包含基釉、配方/版本釉表。成分/属性表。然后是一个扩展的链接/关联表,用于将成分属性链接到配方,还包含数量。
Glaze 表非常简单,只有釉料的名称和唯一标识符。例如
CREATE TABLE IF NOT EXISTS glazes (_id INTEGER PRIMARY KEY, glazename TEXT)
GlazeVersion 表还是比较简单的,一个唯一的标识符、版本和对它的父/基础釉的引用。例如
CREATE TABLE glazeversions (_id INTEGER PRIMARY KEY, version TEXT, glazebase_ref INTEGER)
Indgredients 表再次简单,一个唯一的 ID 和名称,例如
CREATE TABLE ingredients (_id INTEGER PRIMARY KEY, ingredient TEXT)
Recipes 表将引用釉料版本(因此隐含釉料)、成分参考和成分数量字段,例如
CREATE TABLE IF NOT EXISTS recipes (glazeversion_ref INTEGER, ingredient_ref INTEGER, amount INTEGER, PRIMARY KEY(glazeversion_ref, ingredient_ref))
假设我们有 3 种基础釉料红色、绿色和蓝色。 glazes 表中有 3 个条目(出于说明目的,id 为 1 2 和 3)。
还假设每个版本都有名为 Version001、Version002 和 Version003 的三个版本(为了说明目的,glazeversion 表 id 的 1-9 中有 9 行)。
生成的 glazeversions 表可能是:-
可以编写查询来显示链接/关联/引用,例如
SELECT * FROM glazeversions JOIN glazes WHERE glazebase_ref = glazes._id ORDER BY glazename
结果将是:-
对于成分表,我们假设有 5 种成分,赭石、钙、大气、温度(简称 temp)和持续时间(id 分别为 1-5)。例如
现在它在食谱表上,我们最初假设 1 个釉蓝色版本 Version001 的配方,它有 3 种成分 Atmosphere、Temp 和 Ochre
recipes 表将有 3 行,所有三个都引用 glazeversion Version001 用于 glaze Blue (_id 2),但每行都引用各自的成分(id 的 1、3 和 4)。
我们还将假设另外两种釉料:-
Red Version001 有 4 种成分 Duration、Temp、Atmosphere 和 Ocher,所以 4 行都引用了用于 Red (_id 1) 的 glazeversion Version001,各自的成分 id 为 1、3、4 和 5。
Green Version003 含有 2 种成分赭石和钙。所以这两行都引用了蓝色的 glazeversion Version003 (_id 9),相应的成分是 id 的 1 和 2。
所以表格看起来像:-
以下查询是将所有内容捆绑在一起的示例:-
SELECT glazename, version, ingredient, amount FROM recipes JOIN ingredients ON ingredient_ref = ingredients._id JOIN glazeversions ON glazeversion_ref = glazeversions._id JOIN glazes ON glazebase_ref = glazes._id
这将导致:-
如果你只想给 Green Version003 上釉,那么你可以添加一个 WHERE 子句,如下所示:-
SELECT glazename, version, ingredient, amount FROM recipes JOIN ingredients ON ingredient_ref = ingredients._id JOIN glazeversions ON glazeversion_ref = glazeversions._id JOIN glazes ON glazebase_ref = glazes._id WHERE glazeversions._id = 9
这将导致:-