繁体   English   中英

MySql-产品变体表(宽表)-唯一,带有NULL

[英]MySql - Product Variants Table (Wide Table) - Unique with NULLs

我有一个产品表和一个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设计。

谢谢

几乎在每种情况下,指定一个表示“缺失值”的魔术值并不是正确的解决方案。 这就是NULL的目的。

还不清楚如何将“ NO_COLOR”用于整数。 我猜它会映射到值0,该值通常不用于自动增量列。

您可以创建另一列作为三个唯一键列的哈希,默认为''以避免出现空问题。 然后在该哈希上施加唯一约束。

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,
  option_hash binary(16) NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY (option_hash),
  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;

CREATE TRIGGER product_variants_ins BEFORE INSERT ON product_variants
FOR EACH ROW SET option_hash = UNHEX(MD5(CONCAT_WS('|',
    COALESCE(id_product, ''),
    COALESCE(id_colourSet, ''),
    COALESCE(id_size, ''))));

CREATE TRIGGER product_variants_upd BEFORE UPDATE ON product_variants
FOR EACH ROW SET option_hash = UNHEX(MD5(CONCAT_WS('|',
    COALESCE(id_product, ''),
    COALESCE(id_colourSet, ''),
    COALESCE(id_size, ''))));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM