【发布时间】:2016-11-24 06:30:28
【问题描述】:
我有一个 products 表和一个 product_variants 表(一对多)。
product_variants 表结构如下:
CREATE TABLE product_variants (
id int(11) NOT NULL AUTO_INCREMENT,
id_product int(11) NOT NULL,
id_colourSet int(11) DEFAULT NULL,
id_size int(11) DEFAULT NULL,
PRIMARY KEY (id),
UNIQUE KEY UNIQUE (id_product,id_colourSet,id_size),
KEY idx_prod (id_product),
KEY idx_colourSet (id_colourSet),
KEY idx_size (id_size),
CONSTRAINT fk_df_product_variants_id_colurSet FOREIGN KEY (id_colourSet) REFERENCES df_colour_sets (id_colourSet) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT fk_df_product_variants_id_product FOREIGN KEY (id_product) REFERENCES df_products (id) ON DELETE NO ACTION ON UPDATE NO ACTION,
CONSTRAINT fk_df_product_variants_id_size FOREIGN KEY (id_size) REFERENCES df_sizes (id) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB
这些选项在编译时是已知的。每个选项都有一个专用表的外键,唯一键是所有选项的组合。
然后我使用"ON DUPLICATE KEY UPDATE ..." 语句插入产品,如果变体已经存在,则查询将使用现有变体。
问题是某些产品没有颜色,也没有尺寸。在这种情况下,唯一约束失败,我在 product_variants 表中插入了许多几乎为空的行。
为了解决这个问题,我在各个选项表中为每个选项(例如“NO_COLOR”、“NO_SIZE”)创建了一个“NULL”值,并将其用作 product_variants 中选项列的默认值表。
这是推荐的解决方案吗?有没有更好的方法来构建这些数据?我真的很想避免 EAV 设计。
谢谢
【问题讨论】:
标签: mysql sql entity-attribute-value