![](/img/trans.png)
[英]Trying to avoid “Polymorphic Associations” and uphold foreign key referential integrity
[英]Attempting to avoid polymorphic associations
我正在创建一个MySQL数据库,我遇到了一个我需要多态关联的实例......显然SQL不支持这个,所以我决定为每个外键创建一个列; 发现如下:
CREATE TABLE mixers (
mixers_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
0_booze_id INT(11),
0_gen_booze_id INT(11),
0_gen_soda_id INT(11),
0_soda_id INT(11),
1_booze_id INT(11),
1_gen_booze_id INT(11),
1_gen_soda_id INT(11),
1_soda_id INT(11),
2_booze_id INT(11),
2_gen_booze_id INT(11),
2_gen_soda_id INT(11),
2_soda_id INT(11),
3_booze_id INT(11),
3_gen_booze_id INT(11),
3_gen_soda_id INT(11),
3_soda_id INT(11),
4_booze_id INT(11),
4_gen_booze_id INT(11),
4_gen_soda_id INT(11),
4_soda_id INT(11),
5_booze_id INT(11),
5_gen_booze_id INT(11),
5_gen_soda_id INT(11),
5_soda_id INT(11),
6_booze_id INT(11),
6_gen_booze_id INT(11),
6_gen_soda_id INT(11),
6_soda_id INT(11),
7_booze_id INT(11),
7_gen_booze_id INT(11),
7_gen_soda_id INT(11),
7_soda_id INT(11),
8_booze_id INT(11),
8_gen_booze_id INT(11),
8_gen_soda_id INT(11),
8_soda_id INT(11),
9_booze_id INT(11),
9_gen_booze_id INT(11),
9_gen_soda_id INT(11),
9_soda_id INT(11),
FOREIGN KEY (0_booze_id) REFERENCES booze(booze_id),
FOREIGN KEY (1_booze_id) REFERENCES booze(booze_id),
FOREIGN KEY (2_booze_id) REFERENCES booze(booze_id),
FOREIGN KEY (3_booze_id) REFERENCES booze(booze_id),
FOREIGN KEY (4_booze_id) REFERENCES booze(booze_id),
FOREIGN KEY (5_booze_id) REFERENCES booze(booze_id),
FOREIGN KEY (6_booze_id) REFERENCES booze(booze_id),
FOREIGN KEY (7_booze_id) REFERENCES booze(booze_id),
FOREIGN KEY (8_booze_id) REFERENCES booze(booze_id),
FOREIGN KEY (9_booze_id) REFERENCES booze(booze_id),
FOREIGN KEY (0_gen_booze_id) REFERENCES gen_booze(gen_booze_id),
FOREIGN KEY (1_gen_booze_id) REFERENCES gen_booze(gen_booze_id),
FOREIGN KEY (2_gen_booze_id) REFERENCES gen_booze(gen_booze_id),
FOREIGN KEY (3_gen_booze_id) REFERENCES gen_booze(gen_booze_id),
FOREIGN KEY (4_gen_booze_id) REFERENCES gen_booze(gen_booze_id),
FOREIGN KEY (5_gen_booze_id) REFERENCES gen_booze(gen_booze_id),
FOREIGN KEY (6_gen_booze_id) REFERENCES gen_booze(gen_booze_id),
FOREIGN KEY (7_gen_booze_id) REFERENCES gen_booze(gen_booze_id),
FOREIGN KEY (8_gen_booze_id) REFERENCES gen_booze(gen_booze_id),
FOREIGN KEY (9_gen_booze_id) REFERENCES gen_booze(gen_booze_id),
FOREIGN KEY (0_gen_soda_id) REFERENCES gen_soda(gen_soda_id),
FOREIGN KEY (1_gen_soda_id) REFERENCES gen_soda(gen_soda_id),
FOREIGN KEY (2_gen_soda_id) REFERENCES gen_soda(gen_soda_id),
FOREIGN KEY (3_gen_soda_id) REFERENCES gen_soda(gen_soda_id),
FOREIGN KEY (4_gen_soda_id) REFERENCES gen_soda(gen_soda_id),
FOREIGN KEY (5_gen_soda_id) REFERENCES gen_soda(gen_soda_id),
FOREIGN KEY (6_gen_soda_id) REFERENCES gen_soda(gen_soda_id),
FOREIGN KEY (7_gen_soda_id) REFERENCES gen_soda(gen_soda_id),
FOREIGN KEY (8_gen_soda_id) REFERENCES gen_soda(gen_soda_id),
FOREIGN KEY (9_gen_soda_id) REFERENCES gen_soda(gen_soda_id),
FOREIGN KEY (0_soda_id) REFERENCES soda(soda_id),
FOREIGN KEY (1_soda_id) REFERENCES soda(soda_id),
FOREIGN KEY (2_soda_id) REFERENCES soda(soda_id),
FOREIGN KEY (3_soda_id) REFERENCES soda(soda_id),
FOREIGN KEY (4_soda_id) REFERENCES soda(soda_id),
FOREIGN KEY (5_soda_id) REFERENCES soda(soda_id),
FOREIGN KEY (6_soda_id) REFERENCES soda(soda_id),
FOREIGN KEY (7_soda_id) REFERENCES soda(soda_id),
FOREIGN KEY (8_soda_id) REFERENCES soda(soda_id),
FOREIGN KEY (9_soda_id) REFERENCES soda(soda_id)
)ENGINE=InnoDB;
我想做的是设置表格,以便每组成分 -
0_booze_id INT(11),
0_gen_booze_id INT(11),
0_gen_soda_id INT(11),
0_soda_id INT(11)
甚至可以创建这样的东西??? 如果没有,什么是更好的解决方案?
编辑为了澄清 - 我正在制作一个自动饮料混合机器人。 我正在尝试创建一个数据库,允许在没有特定成分的情况下使用通用成分。
例如,如果食谱需要“杰克”和“可乐”,并且我有“杰克”和“可乐”成分,那么我会想要使用这些特定成分。 但是,让我说我有一些我想用来代替可口可乐的品牌可乐。 我想要专门针对“杰克”和“可乐”的食谱能够用“可口可乐”代替“通用可乐”。
我的目的是创建两个通用表,一个用于汽水,一个用于豪饮“gen_soda”“gen_booze”。 这些表格中包含“可乐”,“威士忌”,“伏特加”等物品。 苏打水和酒精的表格将包含特定的成分名称,如“可乐”或“杰克丹尼尔斯”; 然后,这些项目将被引用回其泛型类型。
我最初发布的混音器表是包含机器人知道如何制作的各种混合饮料。 应该提供的唯一混合饮料是具有特定成分的饮料。 这就是我遇到多态关联这个术语的方式。
CREATE TABLE mixers (
mixer_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
mixer_name VARCHAR(255) NOT NULL,
)
CREATE TABLE ingredients (
ingredient_id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
ingredient_name VARCHAR(255) NOT NULL,
)
CREATE TABLE mixer_ingredients
mixer_id INT(11) NOT NULL,
ingredient_id INT(11) NOT NULL,
PRIMARY KEY (mixer_id, ingredient_id),
FOREIGN KEY (mixer_id) REFERENCES mixers(mixer_id),
FOREIGN KEY (ingredient_id) REFERENCES ingredients(ingredient_id),
)
我明白你要做什么,但认为这是错误的做法。 您的数据模型需要更好地适应您的问题。
首先,从成分表开始,列表如下:
然后是MixedDrink
表:
然后是MixedDrinkIngredient
表:
因此,这可以处理混合饮料而无需替换。 你是如何代表他们的?
那么,在这一点上,你需要做出一些决定。 该成分的替代品是否通用 ? 或者某些MixedDrinks
允许替换某些东西而不是其他MixedDrinks
? 根据这些问题的答案,替换信息可以使用MixedDrinkIngredients
, Ingredients
或两者,具体取决于您需要的规则。
顺便说一句,酒和苏打之间的区别嵌入在Ingredients
的type
信息中。 这是一种简化,您可能实际上需要一个层次结构,在层次结构中的特定位置具有替换。 例如,您可能愿意用百事可乐替代可口可乐,但不能用生姜啤酒代替。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.