簡體   English   中英

“多對多”關系

[英]“many to many to many” relation

我有一個簡單的化妝品數據庫。 每個產品可能包含多種成分。 因此,這是一個簡單的多對多關系,目前我有一個這樣的數據庫:

CREATE TABLE `products` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` TEXT NOT NULL,
  PRIMARY KEY (`id`),
);

CREATE TABLE `ingredients` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `name` TEXT NOT NULL,
  PRIMARY KEY (`id`),
);

CREATE TABLE `ingredient_to_product` (
  `ingredient_id` INT UNSIGNED NOT NULL,
  `product_id` INT UNSIGNED NOT NULL,
  PRIMARY KEY (`ingredient_id`, `product_id`),
  INDEX (`product_id`)
);

但是,某些成分可以具有許多不同的名稱。 例如:“亞麻酸精油”,“亞麻酸醇”和“ 3,7-二甲基-1,6-OCTADIEN-3-OL”是指相同的成分。

當我展示一種產品時,我想將成分名稱保持在產品標簽上。 因此,在一種產品的情況下,它將是“ LINALYL ALCOHOL”,在另一種產品的情況下,它將是其他,但指的是相同的成分。

現在,我想通過指定產品名稱之一或ID來查詢數據庫中所有產品的名稱,但是一個ID如何引用許多名稱? 我是否必須保留兩個表:一個表通常用於特定成分,另一個表僅用於名稱(許多名稱與一種成分相關)? 有什么更好的辦法嗎?

Ingredients

  • ID (int)(pkey)(ai)
  • Name (varchar)

Synonyms

  • ID (int)(pkey)(ai)
  • IngredientID (int)(外鍵映射到: Ingredients.ID
  • Name (varchar)
  • Flag (可選;示例值: IUPAC NameCommon NameSpanish Name ...)

因此,是的,對於您描述的規則,您至少要有一個主要名稱,然后是一個使用Ingredients.ID的同義詞表。

我還介紹了一個Flag字段,以便您可以以編程方式選擇何時使用同義詞,而不僅僅是一直對其進行硬編碼。 例如,如果要列出標記為industrial chemical ,則可以對其進行編程以提取IUPAC *名稱

* IUPAC指的是化學物質的命名約定,專業化學家幾乎總是使用它,但在消費超市中幾乎從未使用它: http : //www.chem.uiuc.edu/GenChemReferences/nomenclature_rules.html

我想這是一個好消息,一個名字不能用於多種不同的成分,對嗎?

所以是的,您可能需要一個“成分名稱”表,例如

`name` TEXT NOT NULL,
`ingredient_id` INT UNSIGNED NOT NULL

(我可能只是使用名字作為這里的PK,但是如果你的設計總是利用代理人要求你還需要增加ingredient_name_id我猜...)

然后, ingredient的詳細信息(名稱除外)仍將保留在成分表中。 (您也可以在成分表中保留一個默認名稱,但我不需要。如果需要該概念,我會考慮在成分名稱表中添加一個“默認標志”或類似名稱。)

由於您想知道給定產品用於每種成分的名稱,因此可以將當前的“產品外部參照成分”替換為“產品外部參照成分名稱”。

為什么不為其他成分名稱/化學名稱等創建單獨的表,並將其與產品ID連接起來,以便在需要時可以單獨使用,並避免在主表中包含任何NULL值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM