0

私は製品レシピを実装しようとしています (それは私たちのサプライヤーがそれを呼んでいるものです) が、それを適切に正規化する方法について頭を悩ませているようです.

どのように見えるかを説明するために、いくつかのサンプル データを追加しました。

R*** で始まる値は、レシピ識別子への参照です。数値は製品 ID への参照です。

レシピは製品のグループです (それ以上でもそれ以下でもありません)。レシピが持つ唯一の属性は名前です。これは、製品グループの論理名である必要があります。

ご覧のとおり、製品を順番にレシピに接続することもできます。また、製品は他の製品に直接接続できます。

これに対する唯一の制限は、レシピ (R***) を別のレシピに直接接続できないことです。明確にするために、製品は直接接続できますが、レシピはできません。

サブ記事が多くの異なる親を持つことができるという事実は、私にはちょっとあいまいです。

ここに画像の説明を入力

4

1 に答える 1

0

わかりました...かなりうまくいくように見える次の解決策を思いつきました。

ここに画像の説明を入力

誰かが興味を持っている場合は、次の SQL が作成されます。

CREATE TABLE recipe_node (
  id INT UNSIGNED NOT NULL AUTO_INCREMENT,
  recipe_id INT,
  product_id INT,
  created_at DATETIME NOT NULL,
  updated_at DATETIME,
  deleted TINYINT NOT NULL DEFAULT 0,
  deleted_at DATETIME,
  PRIMARY KEY (id),
  UNIQUE INDEX UNQ_PRODUCT_ID (product_id),
  UNIQUE INDEX UNQ_RECIPE_ID (recipe_id),
  CONSTRAINT FK_RECIPE_NODE_RECIPE_ID_RECEPT_RECEPTID FOREIGN KEY (recipe_id) REFERENCES recept(receptid) ON UPDATE RESTRICT ON DELETE CASCADE,
  CONSTRAINT FK_RECIPE_NODE_PRODUCT_ID_PRODUCT_PRODUCTID FOREIGN KEY (product_id) REFERENCES product(productid) ON UPDATE RESTRICT ON DELETE CASCADE
) ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_general_ci;

CREATE TABLE recipe_graph (
  id int(10) unsigned NOT NULL AUTO_INCREMENT,
  parent_id int(10) unsigned NOT NULL,
  child_id int(10) unsigned NOT NULL,
  quantity int(10) unsigned NOT NULL DEFAULT '1',
  sequence_number int(10) unsigned NOT NULL DEFAULT '1',
  created_at datetime NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY UNQ_PARENT_ID_CHILD_ID (parent_id,child_id),
  KEY IDX_CHILD_ID_PARENT_ID (child_id,parent_id),
  CONSTRAINT FK_RECIPE_GRAPH_CHILD_ID_RECIPE_NODE_ID FOREIGN KEY (child_id) REFERENCES recipe_node (id) ON DELETE CASCADE,
  CONSTRAINT FK_RECIPE_GRAPH_PARENT_ID_RECIPE_NODE_ID FOREIGN KEY (parent_id) REFERENCES recipe_node (id) ON DELETE CASCADE
) ENGINE=INNODB CHARSET=utf8 COLLATE=utf8_general_ci;
于 2015-02-25T07:35:55.237 に答える