[英]“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 Name
, Common Name
, Spanish 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.