SQL - 行是另一个表中的行的组合

时间:2014-04-28 15:59:22

标签: sql sqlite architecture

我有一个运行许多软件的系统。 假设该系统详细说明了从0到烹饪的披萨。 它有以下子系统:

  1. RecipeWizard:挑选选定的成分。
  2. IngredientMixer:将成分涂抹在面团上。
  3. 烤箱:用特定的温度煮比萨饼。
  4. 这些子系统中的每一个都运行一个可以独立升级的独立软件。 对于每个披萨,我们需要知道我们用来制作它的不同软件。

    例如,披萨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:如果你找到一个更好的标题,请告诉我。

1 个答案:

答案 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行,这一行是指一组独特的软件。 那有设计模式吗?

相关问题