我正在建立一个电子商务网站,并使用MySQL存储数据。
我在下面添加了架构图。请让我知道设计中可能存在的缺陷或其中可能出现其他问题。
我要为其设计的产品在表面光洁度,尺寸方面有很多变化,并且具有其独特的特性。
这是我要实现的目标:
我本可以使用EAV来获得独特的属性,但是采用了这种方法。
正如我之前提到的SKU和Price一样,它具有独特的变化属性,因此我在这里添加了它。我在这里得到所有的组合。
这是架构代码:
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
-- -----------------------------------------------------
-- Schema Catelogue
-- -----------------------------------------------------
-- -----------------------------------------------------
-- Schema Catelogue
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `Catelogue` DEFAULT CHARACTER SET utf8 ;
USE `Catelogue` ;
-- -----------------------------------------------------
-- Table `Catelogue`.`brands`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Catelogue`.`brands` ;
CREATE TABLE IF NOT EXISTS `Catelogue`.`brands` (
`ID` VARCHAR(45) NOT NULL,
`b_name` VARCHAR(45) NULL,
`thumbnails` VARCHAR(45) NULL,
PRIMARY KEY (`ID`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Catelogue`.`categorys`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Catelogue`.`categorys` ;
CREATE TABLE IF NOT EXISTS `Catelogue`.`categorys` (
`ID` VARCHAR(45) NOT NULL,
`c_name` VARCHAR(45) NULL,
`thumbnails` VARCHAR(45) NULL,
PRIMARY KEY (`ID`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Catelogue`.`collections`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Catelogue`.`collections` ;
CREATE TABLE IF NOT EXISTS `Catelogue`.`collections` (
`ID` VARCHAR(45) NOT NULL,
`co_name` VARCHAR(45) NULL,
`thumbnails` VARCHAR(45) NULL,
PRIMARY KEY (`ID`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Catelogue`.`base_Relation_table`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Catelogue`.`base_Relation_table` ;
CREATE TABLE IF NOT EXISTS `Catelogue`.`base_Relation_table` (
`ID` INT NOT NULL,
`Brands_ID` VARCHAR(45) NOT NULL,
`Categorys_ID` VARCHAR(45) NOT NULL,
`Collections_ID` VARCHAR(45) NOT NULL,
PRIMARY KEY (`ID`),
INDEX `fk_base_Relation_table_Brands_idx` (`Brands_ID` ASC) VISIBLE,
INDEX `fk_base_Relation_table_Categorys1_idx` (`Categorys_ID` ASC) VISIBLE,
INDEX `fk_base_Relation_table_Collections1_idx` (`Collections_ID` ASC) VISIBLE,
CONSTRAINT `fk_base_Relation_table_Brands`
FOREIGN KEY (`Brands_ID`)
REFERENCES `Catelogue`.`brands` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_base_Relation_table_Categorys1`
FOREIGN KEY (`Categorys_ID`)
REFERENCES `Catelogue`.`categorys` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_base_Relation_table_Collections1`
FOREIGN KEY (`Collections_ID`)
REFERENCES `Catelogue`.`collections` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Catelogue`.`pattern`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Catelogue`.`pattern` ;
CREATE TABLE IF NOT EXISTS `Catelogue`.`pattern` (
`ID` VARCHAR(45) NOT NULL,
`option_name` VARCHAR(45) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE INDEX `values_UNIQUE` (`option_name` ASC) VISIBLE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Catelogue`.`product`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Catelogue`.`product` ;
CREATE TABLE IF NOT EXISTS `Catelogue`.`product` (
`ID` INT NOT NULL,
`p_name` VARCHAR(45) NULL,
`Description` VARCHAR(45) NULL,
`base_Relation_table_ID` INT NOT NULL,
`pattern_ID` VARCHAR(45) NOT NULL,
PRIMARY KEY (`ID`),
INDEX `fk_Product_base_Relation_table1_idx` (`base_Relation_table_ID` ASC) VISIBLE,
UNIQUE INDEX `name_UNIQUE` (`p_name` ASC) VISIBLE,
INDEX `fk_Product_pattern1_idx` (`pattern_ID` ASC) VISIBLE,
CONSTRAINT `fk_Product_base_Relation_table1`
FOREIGN KEY (`base_Relation_table_ID`)
REFERENCES `Catelogue`.`base_Relation_table` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Product_pattern1`
FOREIGN KEY (`pattern_ID`)
REFERENCES `Catelogue`.`pattern` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Catelogue`.`colors`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Catelogue`.`colors` ;
CREATE TABLE IF NOT EXISTS `Catelogue`.`colors` (
`ID` INT NOT NULL,
`color_name` VARCHAR(45) NULL,
PRIMARY KEY (`ID`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Catelogue`.`option_table`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Catelogue`.`option_table` ;
CREATE TABLE IF NOT EXISTS `Catelogue`.`option_table` (
`ID` INT NOT NULL,
`option_name` VARCHAR(45) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE INDEX `values_UNIQUE` (`option_name` ASC) VISIBLE)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Catelogue`.`option_values`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Catelogue`.`option_values` ;
CREATE TABLE IF NOT EXISTS `Catelogue`.`option_values` (
`ID` INT NOT NULL,
`Option_ID` INT NOT NULL,
`value_name` VARCHAR(45) NOT NULL,
PRIMARY KEY (`ID`, `Option_ID`),
UNIQUE INDEX `values_UNIQUE` (`value_name` ASC) VISIBLE,
CONSTRAINT `fk_Option_values_Options1`
FOREIGN KEY (`Option_ID`)
REFERENCES `Catelogue`.`option_table` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Catelogue`.`finish`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Catelogue`.`finish` ;
CREATE TABLE IF NOT EXISTS `Catelogue`.`finish` (
`ID` INT NOT NULL,
`finish_name` VARCHAR(45) NULL,
PRIMARY KEY (`ID`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Catelogue`.`product_variant`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Catelogue`.`product_variant` ;
CREATE TABLE IF NOT EXISTS `Catelogue`.`product_variant` (
`Variant_ID` INT NOT NULL,
`Product_ID` INT NOT NULL,
`Finish_ID` INT NOT NULL,
`Colors_ID` INT NOT NULL,
`metadata` VARCHAR(45) NULL,
`thumbnail` VARCHAR(45) NOT NULL DEFAULT '\" \"',
INDEX `fk_ProductDetails_Finish1_idx` (`Finish_ID` ASC) VISIBLE,
INDEX `fk_ProductDetails_Colors1_idx` (`Colors_ID` ASC) VISIBLE,
INDEX `fk_Product_Variant_Product1_idx` (`Product_ID` ASC) VISIBLE,
PRIMARY KEY (`Variant_ID`, `Product_ID`),
CONSTRAINT `fk_ProductDetails_Finish1`
FOREIGN KEY (`Finish_ID`)
REFERENCES `Catelogue`.`finish` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_ProductDetails_Colors1`
FOREIGN KEY (`Colors_ID`)
REFERENCES `Catelogue`.`colors` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Product_Variant_Product1`
FOREIGN KEY (`Product_ID`)
REFERENCES `Catelogue`.`product` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Catelogue`.`product_option_relation`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Catelogue`.`product_option_relation` ;
CREATE TABLE IF NOT EXISTS `Catelogue`.`product_option_relation` (
`Product_ID` INT NOT NULL,
`Option_ID` INT NOT NULL,
INDEX `fk_Product_Option_Product1_idx` (`Product_ID` ASC) VISIBLE,
INDEX `fk_Product_Option_Options1_idx` (`Option_ID` ASC) VISIBLE,
PRIMARY KEY (`Product_ID`, `Option_ID`),
CONSTRAINT `fk_Product_Option_Product1`
FOREIGN KEY (`Product_ID`)
REFERENCES `Catelogue`.`product` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Product_Option_Options1`
FOREIGN KEY (`Option_ID`)
REFERENCES `Catelogue`.`option_table` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Catelogue`.`dimensions`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Catelogue`.`dimensions` ;
CREATE TABLE IF NOT EXISTS `Catelogue`.`dimensions` (
`ID` INT NOT NULL,
`dimensions_value` VARCHAR(45) NULL,
PRIMARY KEY (`ID`))
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Catelogue`.`dimensions_has_product_variant`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Catelogue`.`dimensions_has_product_variant` ;
CREATE TABLE IF NOT EXISTS `Catelogue`.`dimensions_has_product_variant` (
`Dimensions_ID` INT NOT NULL,
`Product_ID` INT NOT NULL,
`Variant_ID` INT NOT NULL,
PRIMARY KEY (`Dimensions_ID`, `Product_ID`, `Variant_ID`),
INDEX `fk_Dimensions_has_Product_Variant_Product_Variant1_idx` (`Product_ID` ASC, `Variant_ID` ASC) VISIBLE,
CONSTRAINT `fk_Dimensions_has_Product_Variant_Dimensions1`
FOREIGN KEY (`Dimensions_ID`)
REFERENCES `Catelogue`.`dimensions` (`ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_Dimensions_has_Product_Variant_Product_Variant1`
FOREIGN KEY (`Product_ID` , `Variant_ID`)
REFERENCES `Catelogue`.`product_variant` (`Product_ID` , `Variant_ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Catelogue`.`variant_value`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Catelogue`.`variant_value` ;
CREATE TABLE IF NOT EXISTS `Catelogue`.`variant_value` (
`Product_ID` INT NOT NULL,
`Option_ID` INT NOT NULL,
`Value_ID` INT NOT NULL,
`Dimensions_ID` INT NOT NULL,
`Variant_ID` INT NOT NULL,
`price` VARCHAR(45) NOT NULL,
`SKU` VARCHAR(45) NULL,
PRIMARY KEY (`Product_ID`, `Option_ID`, `Value_ID`, `Dimensions_ID`, `Variant_ID`),
INDEX `fk3_option_values_idx` (`Value_ID` ASC, `Option_ID` ASC) VISIBLE,
INDEX `fk2_product_options_idx` (`Product_ID` ASC, `Option_ID` ASC) VISIBLE,
INDEX `fk_variant_value_dimensions_has_product_variant1_idx` (`Dimensions_ID` ASC, `Variant_ID` ASC, `Product_ID` ASC) VISIBLE,
CONSTRAINT `fk2_product_options`
FOREIGN KEY (`Product_ID` , `Option_ID`)
REFERENCES `Catelogue`.`product_option_relation` (`Product_ID` , `Option_ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk3_option_values`
FOREIGN KEY (`Value_ID` , `Option_ID`)
REFERENCES `Catelogue`.`option_values` (`ID` , `Option_ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `fk_variant_value_dimensions_has_product_variant1`
FOREIGN KEY (`Dimensions_ID` , `Variant_ID` , `Product_ID`)
REFERENCES `Catelogue`.`dimensions_has_product_variant` (`Dimensions_ID` , `Variant_ID` , `Product_ID`)
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
我有什么想念的吗?会规模吗?设计看起来好吗?
答案 0 :(得分:0)
它是“过度规范化”的。例如,查看colors
。您将3字节的“红色”替换为4字节的整数。没有空间节省。 (好吧,“洋红色”占用了4个字节,但不多。)
规范化的另一个目的是使在整个数据集中更容易更改“红色”的拼写。我认为那不会发生。
因此......具有“常用”或“重要”或“常用搜索”属性列。
对于其他属性,将它们放入JSON字符串中,并使其称为other_attributes
的列。
尽管您的架构比普通的EAV更复杂,但是这里讨论了为什么EAV较差以及如何处理:http://mysql.rjweb.org/doc.php/eav
对于dimensions
,请考虑使用该值或值列表。我怀疑除了在屏幕上显示该列表之外,您对"30x40,40x60"
不会做任何事情。它本质上是不可搜索的。因此,唯一实际的事情是将该字符串放入我建议的JSON中。