我有一个运行许多软件的系统。 假设该系统详细说明了从0到烹饪的披萨。 它有以下子系统:
这些子系统中的每一个都运行一个可以独立升级的独立软件。 对于每个披萨,我们需要知道我们用来制作它的不同软件。
例如,披萨n°X是使用RecipeWizard v1.0,IngredientMixer v2.3,Oven v1.1制作的
我做了以下(简化):
CREATE TABLE pizza (
id_pizza INTEGER NOT NULL PRIMARY KEY NOT NULL,
something INTEGER NULL,
...,
);
软件具有属性。在此表中,可能会出现几次软件,但版本或版本不同。这让我知道整个系统中放了什么软件。
CREATE TABLE softwareProperties (
id_softwareProperties INTEGER NOT NULL PRIMARY KEY NOT NULL,
name VARCHAR(16) NULL,
version INTEGER NULL,
revision INTEGER NULL
);
软件的修订版(如在SVN修订版中)应该经常更改(每个开发人员每天2-3次)以进行测试。
最后一张表如下:
CREATE TABLE IF NOT EXISTS softwareVersion (
id_softwareVersion INTEGER NOT NULL PRIMARY KEY NOT NULL,
fk_pizza INTEGER NOT NULL,
fk_RecipeWizard INTEGER NOT NULL,
fk_IngredientMixer INTEGER NOT NULL,
fk_Oven INTEGER NOT NULL,
CONSTRAINT c_01_softwareVersion FOREIGN KEY (fk_pizza) REFERENCES pizza (id_pizza)
CONSTRAINT c_02_softwareVersion FOREIGN KEY (fk_RecipeWizard ) REFERENCES softwareProperties (id_softwareProperties)
CONSTRAINT c_03_softwareVersion FOREIGN KEY (fk_IngredientMixer) REFERENCES softwareProperties (id_softwareProperties)
CONSTRAINT c_04_softwareVersion FOREIGN KEY (fk_Oven) REFERENCES softwareProperties (id_softwareProperties)
);
你有更好的方法来做这个,而不是有多个外键吗? PS:如果你找到一个更好的标题,请告诉我。
答案 0 :(得分:0)
我看过多对多的关系。显然,我必须删除softwareVersion表中的所有外键。
CREATE TABLE IF NOT EXISTS softwareVersion (
fk_pizza INTEGER NOT NULL,
fk_softwareProperties INTEGER NOT NULL,
CONSTRAINT c_01_softwareVersion PRIMARY KEY (fk_pizza, fk_softwareProperties),
CONSTRAINT c_02_softwareVersion FOREIGN KEY (fk_pizza) REFERENCES pizza (id_pizza)
CONSTRAINT c_03_softwareVersion FOREIGN KEY (fk_softwareProperties ) REFERENCES softwareProperties (id_softwareProperties)
);
问题是,对于每个披萨,此表将添加尽可能多的行,因为有不同的软件。在这种情况下,每个披萨将有3行。
所以,理想的情况是在连接表中有1个披萨,1行,这一行是指一组独特的软件。 那有设计模式吗?