From f44e1a060bb9d29c4db97b271726e313c00b2bc7 Mon Sep 17 00:00:00 2001 From: Nicolas Oliver Date: Wed, 7 Jun 2023 21:26:53 -0700 Subject: [PATCH] Add csv generation, data loading, and queries --- .gitignore | 1 + README.md | 22 ++- csv.sh | 80 ++++++++++ query.sql | 431 +++++++++++++++++++++++++++++++++++++++++++++++++++++ rd.png | Bin 0 -> 62347 bytes schema.sql | 28 +--- 6 files changed, 532 insertions(+), 30 deletions(-) create mode 100644 csv.sh create mode 100644 query.sql create mode 100644 rd.png diff --git a/.gitignore b/.gitignore index 1275d8b..3bb08a8 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ node_modules db.json db.*.json schema.*.json +*.csv diff --git a/README.md b/README.md index ca414e1..7af03fe 100644 --- a/README.md +++ b/README.md @@ -16,32 +16,44 @@ sys 0m0.983s node schema.js ``` -## Product Types +## Database Overview + +### Product Types ```bash jq '.[].name' db.json ``` -## Product Brands +### Product Brands ```bash jq '.[0].products[].name' db.json ``` -## Product Series +### Product Series ```bash jq '.[0].products[0].subproducts[].name' db.json ``` -## Products +### Products ```bash jq '.[0].products[0].subproducts[0].skus[]."Product Name"' db.json ``` -## Specification Categories +### Specification Categories ```bash jq '.[0].products[0].subproducts[0].skus[0].specs | keys' db.json ``` + +## Data Loading + +```bash +\copy ProductTypes FROM 'ProductTypes.csv' DELIMITER ',' CSV HEADER ENCODING 'UTF8'; +\copy ProductBrands FROM 'ProductBrands.csv' DELIMITER ',' CSV HEADER ENCODING 'UTF8'; +\copy ProductSeries FROM 'ProductSeries.csv' DELIMITER ',' CSV HEADER ENCODING 'UTF8'; +\copy Products FROM 'Products.csv' DELIMITER ',' CSV HEADER ENCODING 'UTF8'; +\copy ProductsSpecifications FROM 'ProductsSpecifications.csv' DELIMITER ',' CSV HEADER ENCODING 'UTF8'; +``` \ No newline at end of file diff --git a/csv.sh b/csv.sh new file mode 100644 index 0000000..dc52391 --- /dev/null +++ b/csv.sh @@ -0,0 +1,80 @@ +#!/bin/bash + +# This script reads a db.json file, and convert it into a series of CSV files: +# ProductTypes.csv +# ProductBrands.csv +# ProductSeries.csv +# Products.csv +# ProductsSpecifications.csv + +PRODUCT_TYPES=$(jq '.[].name' db.json | tr -d '"') +PRODUCT_TYPE_ID=1 +rm -fr ProductTypes.csv +rm -fr ProductBrands.csv +rm -fr ProductSeries.csv +rm -fr Products.csv + +echo "Id,Name" >> ProductTypes.csv +echo "ProductType,Id,Name" >> ProductBrands.csv +echo "ProductType,ProductBrand,Id,Name,Url" >> ProductSeries.csv +echo "ProductType,ProductBrand,ProductSerie,Id,Name,Url" >> Products.csv + +while IFS= read -r PRODUCT_TYPE ; do + echo "$PRODUCT_TYPE_ID,$PRODUCT_TYPE" >> ProductTypes.csv + + PRODUCT_BRANDS=$(jq \ + --arg product_type "$(echo "$PRODUCT_TYPE")" \ + '.[] | select(.name == $product_type) | .products[].name' db.json | tr -d '"') + PRODUCT_BRAND_ID=1 + + while IFS= read -r PRODUCT_BRAND ; do + echo "$PRODUCT_TYPE_ID,$PRODUCT_BRAND_ID,$PRODUCT_BRAND" >> ProductBrands.csv + + PRODUCT_SERIES=$(jq \ + --arg product_type "$(echo "$PRODUCT_TYPE")" \ + --arg product_brand "$(echo "$PRODUCT_BRAND")" \ + '.[] | select(.name == $product_type) | .products[] | select(.name == $product_brand) | .subproducts[].name' db.json | tr -d '"') + PRODUCT_SERIE_ID=1 + + while IFS= read -r PRODUCT_SERIE ; do + PRODUCT_SERIE_URL=$(jq \ + --arg product_serie "$(echo "$PRODUCT_SERIE")" \ + '.[].products[].subproducts[] | select(.name == $product_serie) | .href' db.json | tr -d '"') + PRODUCT_SERIE=$(echo "$PRODUCT_SERIE" | tr -d '\r') + echo "$PRODUCT_TYPE_ID,$PRODUCT_BRAND_ID,$PRODUCT_SERIE_ID,$PRODUCT_SERIE,$PRODUCT_SERIE_URL" >> ProductSeries.csv + + PRODUCTS=$(jq \ + --arg product_type "$(echo "$PRODUCT_TYPE")" \ + --arg product_brand "$(echo "$PRODUCT_BRAND")" \ + --arg product_serie "$(echo "$PRODUCT_SERIE")" \ + '.[] | select(.name == $product_type) | .products[] | select(.name == $product_brand) | .subproducts[] | select(.name == $product_serie) | .skus[]."Product Name"' db.json | tr -d '"') + PRODUCT_ID=1 + + while IFS= read -r PRODUCT ; do + PRODUCT_URL=$(jq \ + --arg product "$(echo "$PRODUCT")" \ + '.[].products[].subproducts[].skus[] | select(."Product Name" == $product) | .Url' db.json | tr -d '"') + PRODUCT=$(echo "$PRODUCT" | tr -d '\r') + echo "$PRODUCT_TYPE_ID,$PRODUCT_BRAND_ID,$PRODUCT_SERIE_ID,$PRODUCT_ID,$PRODUCT,$PRODUCT_URL" >> Products.csv + PRODUCT_ID=$((PRODUCT_ID + 1)) + done <<< "$PRODUCTS" + PRODUCT_SERIE_ID=$((PRODUCT_SERIE_ID + 1)) + done <<< "$PRODUCT_SERIES" + PRODUCT_BRAND_ID=$((PRODUCT_BRAND_ID + 1)) + done <<< "$PRODUCT_BRANDS" + PRODUCT_TYPE_ID=$((PRODUCT_TYPE_ID + 1)) +done <<< "$PRODUCT_TYPES" + +echo "ProductType,ProductBrand,ProductSerie,ProductId,Specification,Value" >> ProductsSpecifications.csv +sed 1d Products.csv | while IFS= read -r LINE; do + PRODUCT_TYPE=$(echo $LINE | awk -F, '{print $1}') + PRODUCT_BRAND=$(echo $LINE | awk -F, '{print $2}') + PRODUCT_SERIE=$(echo $LINE | awk -F, '{print $3}') + PRODUCT_ID=$(echo $LINE | awk -F, '{print $4}') + PRODUCT_NAME=$(echo $LINE | awk -F, '{print $5}') + + jq \ + --arg product "$(echo "$PRODUCT_NAME")" \ + '.[].products[].subproducts[].skus[] | select(."Product Name" == $product) | .specs | [leaf_paths as $path | {"key": $path | join("."), "value": getpath($path)}] | (map(keys) | add | unique) as $cols | map(. as $row | $cols | map($row[.])) as $rows | $rows[] | @csv'\ + db.json | sed -e "s/^/${PRODUCT_TYPE},${PRODUCT_BRAND},${PRODUCT_SERIE},${PRODUCT_ID},/" >> ProductsSpecifications.csv +done \ No newline at end of file diff --git a/query.sql b/query.sql new file mode 100644 index 0000000..612f727 --- /dev/null +++ b/query.sql @@ -0,0 +1,431 @@ +-- 1. Which is the latest Intel Core Processor released? + +select IntelCoreProducts.Name, IntelCoreProducts.Url, LatestProducts.Value as "Launch Date" +from ( + select ProductType, ProductBrand, ProductSerie, Id, Name, Url + from Products + where (ProductType, ProductBrand) in ( + select ProductType, Id as ProductBrand + from ProductBrands + where name = 'Intel® Core™ Processors' + ) +) IntelCoreProducts +join ( + select * + from ProductsSpecifications + where Specification = 'Supplemental Information.Launch Date' + and Value = ( + select Value as "Max Launch Date" + from ProductsSpecifications + where (ProductType, ProductBrand, ProductSerie, ProductId) in ( + select ProductType, ProductBrand, ProductSerie, Id as ProductId + from Products + where (ProductType, ProductBrand) in ( + select ProductType, Id as ProductBrand + from ProductBrands + where name = 'Intel® Core™ Processors' + ) + ) + and Specification = 'Supplemental Information.Launch Date' + order by substring(Value from 4 for 2) desc, substring(Value from 2 for 1) desc + limit 1 + ) +) LatestProducts +on IntelCoreProducts.ProductType = LatestProducts.ProductType +and IntelCoreProducts.ProductBrand = LatestProducts.ProductBrand +and IntelCoreProducts.ProductSerie = LatestProducts.ProductSerie +and IntelCoreProducts.Id = LatestProducts.ProductId + +-- 2. Which is the latest Intel Xeon Processor released? + +select IntelXeonProducts.Name, IntelXeonProducts.Url, LatestProducts.Value as "Launch Date" +from ( + select ProductType, ProductBrand, ProductSerie, Id, Name, Url + from Products + where (ProductType, ProductBrand) in ( + select ProductType, Id as ProductBrand + from ProductBrands + where name = 'Intel® Xeon® Processors' + ) +) IntelXeonProducts +join ( + select * + from ProductsSpecifications + where Specification = 'Supplemental Information.Launch Date' + and Value = ( + select Value as "Max Launch Date" + from ProductsSpecifications + where (ProductType, ProductBrand, ProductSerie, ProductId) in ( + select ProductType, ProductBrand, ProductSerie, Id as ProductId + from Products + where (ProductType, ProductBrand) in ( + select ProductType, Id as ProductBrand + from ProductBrands + where name = 'Intel® Xeon® Processors' + ) + ) + and Specification = 'Supplemental Information.Launch Date' + order by substring(Value from 4 for 2) desc, substring(Value from 2 for 1) desc + limit 1 + ) +) LatestProducts +on IntelXeonProducts.ProductType = LatestProducts.ProductType +and IntelXeonProducts.ProductBrand = LatestProducts.ProductBrand +and IntelXeonProducts.ProductSerie = LatestProducts.ProductSerie +and IntelXeonProducts.Id = LatestProducts.ProductId; + +-- 3. Which processors works with a Thermal Design Power between 95 and 105 W? + +select Name, Url +from Products +where (ProductType, ProductBrand, ProductSerie, Id) in ( + select ProductType, ProductBrand, ProductSerie, ProductId as Id + from ProductsSpecifications + where Specification = 'CPU Specifications.TDP' + and left(Value, -2)::numeric >= 95 + and left(Value, -2)::numeric <= 105 +); + +-- 4. Which processors were launched in 2021? + +select Name, Url +from Products +join ( + select ProductType, ProductBrand, ProductSerie, ProductId + from ProductsSpecifications + where Specification = 'Supplemental Information.Launch Date' + and substring(Value from 4 for 2) = '21' +) ProductsLaunchedIn2021 +on Products.ProductType = ProductsLaunchedIn2021.ProductType +and Products.ProductBrand = ProductsLaunchedIn2021.ProductBrand +and Products.ProductSerie = ProductsLaunchedIn2021.ProductSerie +and Products.Id = ProductsLaunchedIn2021.ProductId +where Products.ProductType = ( + select Id + from ProductTypes + where name = 'Processors' +); + +-- 5. Which is the processor with the maximum base frequency available? + +select Name, Url +from Products +join ( + select ProductType, ProductBrand, ProductSerie, ProductId + from ProductsSpecifications + where ProductType = ( + select Id + from ProductTypes + where Name = 'Processors' + ) + and Specification = 'CPU Specifications.Processor Base Frequency' + and right(Value, 3) = 'GHz' + and left(Value, -4)::numeric = ( + select max(left(Value, -4)::numeric) as "Max Processor Base Frequency" + from ProductsSpecifications + where ProductType = ( + select Id + from ProductTypes + where Name = 'Processors' + ) + and Specification = 'CPU Specifications.Processor Base Frequency' + and right(Value, 3) = 'GHz' + ) +) ProcessorsWithMaxBaseFrequency +on Products.ProductType = ProcessorsWithMaxBaseFrequency.ProductType +and Products.ProductBrand = ProcessorsWithMaxBaseFrequency.ProductBrand +and Products.ProductSerie = ProcessorsWithMaxBaseFrequency.ProductSerie +and Products.Id = ProcessorsWithMaxBaseFrequency.ProductId; + +-- 6. Which processor generation was available in 2018? + +select Name, Url +from ProductSeries +join ( + select ProductType, ProductBrand, ProductSerie + from ProductsSpecifications + where Specification = 'Supplemental Information.Launch Date' + and substring(Value from 4 for 2) = '18' + and (ProductType, ProductBrand) = ( + select ProductType, Id as ProductBrand + from ProductBrands + where name = 'Intel® Core™ Processors' + ) +) IntelCoreProcessorsLaunchedIn2018 +on ProductSeries.ProductType = IntelCoreProcessorsLaunchedIn2018.ProductType +and ProductSeries.ProductBrand = IntelCoreProcessorsLaunchedIn2018.ProductBrand +and ProductSeries.Id = IntelCoreProcessorsLaunchedIn2018.ProductSerie +group by Name, Url + +-- 7. Which is the most inexpensive NUC mini-PC? + +select Name, Url +from Products +join ( + select ProductType, ProductBrand, ProductSerie, ProductId + from ProductsSpecifications + where Specification = 'Essentials.Recommended Customer Price' + and split_part(split_part(Value, ' ', 1), '$', 2)::numeric = ( + select min("Min Price") + from ( + select split_part(split_part(Value, ' ', 1), '$', 2)::numeric as "Min Price" + from ProductsSpecifications + where Specification = 'Essentials.Recommended Customer Price' + and ProductType = ( + select Id + from ProductTypes + where Name = 'Intel® NUC' + ) + ) IntelNucMinPrices + ) + and ProductType = ( + select Id + from ProductTypes + where Name = 'Intel® NUC' + ) +) MinPriceIntelNuc +on Products.ProductType = MinPriceIntelNuc.ProductType +and Products.ProductBrand = MinPriceIntelNuc.ProductBrand +and Products.ProductSerie = MinPriceIntelNuc.ProductSerie +and Products.Id = MinPriceIntelNuc.ProductId + +-- 8. Which is the most expensive NUC mini-PC? + +select Name, Url +from Products +join ( + select ProductType, ProductBrand, ProductSerie, ProductId + from ProductsSpecifications + where Specification = 'Essentials.Recommended Customer Price' + and split_part(split_part(Value, ' ', 1), '$', 2)::numeric = ( + select max("Max Price") + from ( + select split_part(split_part(Value, ' ', 1), '$', 2)::numeric as "Max Price" + from ProductsSpecifications + where Specification = 'Essentials.Recommended Customer Price' + and ProductType = ( + select Id + from ProductTypes + where Name = 'Intel® NUC' + ) + ) IntelNucMaxPrices + ) + and ProductType = ( + select Id + from ProductTypes + where Name = 'Intel® NUC' + ) +) MinPriceIntelNuc +on Products.ProductType = MinPriceIntelNuc.ProductType +and Products.ProductBrand = MinPriceIntelNuc.ProductBrand +and Products.ProductSerie = MinPriceIntelNuc.ProductSerie +and Products.Id = MinPriceIntelNuc.ProductId + +-- 9. Which are the vPro enabled platforms in the 11th generation of Core products? + +select Name, Url +from Products +join ( + select ProductType, ProductBrand, ProductSerie, ProductId + from ProductsSpecifications + where Specification = 'Advanced Technologies.Intel vPro® Platform Eligibility ‡' + and Value = 'Yes' + and (ProductType, ProductBrand, ProductSerie) in ( + select ProductType, ProductBrand, Id as ProductSerie + from ProductSeries + where Name like '%' || '11th Generation Intel® Core™' || '%' + ) +) IntelVProEnabledProducts +on Products.ProductType = IntelVProEnabledProducts.ProductType +and Products.ProductBrand = IntelVProEnabledProducts.ProductBrand +and Products.ProductSerie = IntelVProEnabledProducts.ProductSerie +and Products.Id = IntelVProEnabledProducts.ProductId; + +-- 10. Which are the different Intel FPGA platforms? + +select Name, Url +from Products +where ProductType = ( + select Id + from ProductTypes + where Name = 'Intel® FPGAs' +); + +-- 11. Which is the latest available Intel IPU platforms? + +select Name, Url +from Products +join ( + select distinct ProductType, ProductBrand, ProductSerie, ProductId + from ProductsSpecifications + where value like '%' || 'IPU' || '%' +) IntelProductsWithIPU +on Products.ProductType = IntelProductsWithIPU.ProductType +and Products.ProductBrand = IntelProductsWithIPU.ProductBrand +and Products.ProductSerie = IntelProductsWithIPU.ProductSerie +and Products.Id = IntelProductsWithIPU.ProductId; + +-- 12. Which is the average price of a Intel Core CPU by Generation? + +select Name, Url, "Avg Price" +from ProductSeries +join ( + select ProductType, ProductBrand, ProductSerie, + trunc(avg(split_part(split_part(Value, ' ', 1), '$', 2)::numeric), 2)::money as "Avg Price" + from ProductsSpecifications + where (ProductType, ProductBrand) in ( + select ProductType, Id as ProductBrand + from ProductBrands + where Name = 'Intel® Core™ Processors' + ) + and Specification = 'Essentials.Recommended Customer Price' + group by ProductType, ProductBrand, ProductSerie +) ProductSeriesAvgPrices +on ProductSeries.ProductType = ProductSeriesAvgPrices.ProductType +and ProductSeries.ProductBrand = ProductSeriesAvgPrices.ProductBrand +and ProductSeries.Id = ProductSeriesAvgPrices.ProductSerie; + +-- 13. Which platforms have more than 20 Cores and a Frequency Grater Than 4.5 GHz? + +select Products.Name, Products.Url +from Products +join ( + ( + select ProductType, ProductBrand, ProductSerie, ProductId + from ProductsSpecifications + where Specification = 'CPU Specifications.Total Cores' + and Value::numeric > 20 + ) + INTERSECT + ( + select ProductType, ProductBrand, ProductSerie, ProductId + from ProductsSpecifications + where Specification = 'CPU Specifications.Processor Base Frequency' + and right(Value, 3) = 'GHz' + and left(Value, -4)::numeric >= 4.5 + ) +) ProductsWithMoreThan20CoresAndMoreThan45Ghz +on Products.ProductType = ProductsWithMoreThan20CoresAndMoreThan45Ghz.ProductType +and Products.ProductBrand = ProductsWithMoreThan20CoresAndMoreThan45Ghz.ProductBrand +and Products.ProductSerie = ProductsWithMoreThan20CoresAndMoreThan45Ghz.ProductSerie +and Products.Id = ProductsWithMoreThan20CoresAndMoreThan45Ghz.ProductId; + +-- 14. Which platforms supports Intel Boot Guard? + +select Name, Url +from Products +join ( + select distinct ProductType, ProductBrand, ProductSerie, ProductId + from ProductsSpecifications + where Specification = 'Security & Reliability.Intel® Boot Guard' + and Value = 'Yes' +) IntelProductsWithIntelBootGuard +on Products.ProductType = IntelProductsWithIntelBootGuard.ProductType +and Products.ProductBrand = IntelProductsWithIntelBootGuard.ProductBrand +and Products.ProductSerie = IntelProductsWithIntelBootGuard.ProductSerie +and Products.Id = IntelProductsWithIntelBootGuard.ProductId; + +-- 15. Which platforms supports Intel Remote Platform Erase? + +select Name, Url +from Products +join ( + select distinct ProductType, ProductBrand, ProductSerie, ProductId + from ProductsSpecifications + where Specification = 'Security & Reliability.Intel® Remote Platform Erase (RPE) ‡' + and Value = 'Yes' +) IntelProductsWithIntelBootGuard +on Products.ProductType = IntelProductsWithIntelBootGuard.ProductType +and Products.ProductBrand = IntelProductsWithIntelBootGuard.ProductBrand +and Products.ProductSerie = IntelProductsWithIntelBootGuard.ProductSerie +and Products.Id = IntelProductsWithIntelBootGuard.ProductId; + +-- 16. Which is the maximum Temperature Junction allowed by the 9th Gen Intel Core processor that has the greater number of cores? + +select + Products.Name, + Products.Url, + ProductsWithMaxTJunction.Value as "Maximum Temperature Junction" +from Products +join ( + select ProductsSpecifications.* + from ProductsSpecifications + join ( + select distinct + ProductsSpecifications.ProductType, + ProductsSpecifications.ProductBrand, + ProductsSpecifications.ProductSerie, + ProductsSpecifications.ProductId + from ProductsSpecifications + join ( + select ProductType, ProductBrand, ProductSerie, max(Value::numeric) as "Max Total Cores" + from ProductsSpecifications P2 + where (ProductType, ProductBrand, ProductSerie) in ( + select ProductType, ProductBrand, Id as ProductSerie + from ProductSeries + where Name like '9th Generation Intel® Core™' || '%' || 'Processors' + ) + and Specification = 'CPU Specifications.Total Cores' + group by ProductType, ProductBrand, ProductSerie + ) MaxCoresBySeries + on ProductsSpecifications.ProductType = MaxCoresBySeries.ProductType + and ProductsSpecifications.ProductBrand = MaxCoresBySeries.ProductBrand + and ProductsSpecifications.ProductSerie = MaxCoresBySeries.ProductSerie + where Specification = 'CPU Specifications.Total Cores' + and Value::numeric = "Max Total Cores" + ) ProductsWithMaxCores + on ProductsSpecifications.ProductType = ProductsWithMaxCores.ProductType + and ProductsSpecifications.ProductBrand = ProductsWithMaxCores.ProductBrand + and ProductsSpecifications.ProductSerie = ProductsWithMaxCores.ProductSerie + and ProductsSpecifications.ProductId = ProductsWithMaxCores.ProductId + and Specification = 'Package Specifications.TJUNCTION' +) ProductsWithMaxTJunction +on Products.ProductType = ProductsWithMaxTJunction.ProductType +and Products.ProductBrand = ProductsWithMaxTJunction.ProductBrand +and Products.ProductSerie = ProductsWithMaxTJunction.ProductSerie +and Products.Id = ProductsWithMaxTJunction.ProductId; + +-- 17. Which platforms are “Edge” enabled? (prepared for “Edge Applications”) + +select Name, Url +from Products +join ( + select distinct ProductType, ProductBrand, ProductSerie, ProductId + from ProductsSpecifications + where value like '%' || 'Edge Enhanced' || '%' +) IntelEdgeProducts +on Products.ProductType = IntelEdgeProducts.ProductType +and Products.ProductBrand = IntelEdgeProducts.ProductBrand +and Products.ProductSerie = IntelEdgeProducts.ProductSerie +and Products.Id = IntelEdgeProducts.ProductId; + +-- 18. Which are the different Code Names? + +select distinct Value as "Code Names" +from ProductsSpecifications +where Specification = 'Essentials.Code Name' + +-- 19. Which are the different Intel GPUs? + +select Name, Url +from Products +where ProductType = ( + select Id + from ProductTypes + where Name = 'Graphics' +); + +-- 20. Which are the different Elkhart Lake Products? + +select Products.Name, Products.Url +from Products +join ( + select distinct ProductType, ProductBrand, ProductSerie, ProductId + from ProductsSpecifications + where Specification = 'Essentials.Code Name' + and Value = 'Products formerly Elkhart Lake' +) ElkhartLakeProducts +on Products.ProductType = ElkhartLakeProducts.ProductType +and Products.ProductBrand = ElkhartLakeProducts.ProductBrand +and Products.ProductSerie = ElkhartLakeProducts.ProductSerie +and Products.Id = ElkhartLakeProducts.ProductId; diff --git a/rd.png b/rd.png new file mode 100644 index 0000000000000000000000000000000000000000..03211fa897547782fdd9c3fb91ee36063a4aa0b3 GIT binary patch literal 62347 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 literal 0 HcmV?d00001 diff --git a/schema.sql b/schema.sql index 70c55c6..29a9a2c 100644 --- a/schema.sql +++ b/schema.sql @@ -43,42 +43,20 @@ CREATE TABLE Products ( CONSTRAINT UQ_Product_Url UNIQUE (Url) ); -CREATE TABLE SpecificationCategories ( - Id INT NOT NULL, - Name TEXT NOT NULL, - - CONSTRAINT PK_SpecificationCategories PRIMARY KEY (Id), - CONSTRAINT UQ_SpecificationCategories_Name UNIQUE (Name) -); - -CREATE TABLE SpecificationProperties ( - SpecificationCategory INT NOT NULL, - Id INT NOT NULL, - Name TEXT NOT NULL, - - CONSTRAINT PK_SpecificationProperties PRIMARY KEY (SpecificationCategory, Id), - CONSTRAINT FK_SpecificationProperties_SpecificationCategories FOREIGN KEY (SpecificationCategory) REFERENCES SpecificationCategories (Id), - CONSTRAINT UQ_SpecificationProperties_Name UNIQUE (Name) -); - CREATE TABLE ProductsSpecifications ( ProductType INT NOT NULL, ProductBrand INT NOT NULL, ProductSerie INT NOT NULL, ProductId INT NOT NULL, - SpecificationCategory INT NOT NULL, - SpecificationProperty INT NOT NULL, + Specification TEXT NOT NULL, Value TEXT NOT NULL, - CONSTRAINT PK_ProductsSpecifications PRIMARY KEY (ProductType, ProductBrand, ProductSerie, ProductId, SpecificationCategory, SpecificationProperty), - CONSTRAINT FK_ProductsSpecifications_Products FOREIGN KEY (ProductType, ProductBrand, ProductSerie, ProductId) REFERENCES Products (ProductType, ProductBrand, ProductSerie, Id), - CONSTRAINT FK_ProductsSpecifications_SpecificationProperties FOREIGN KEY (SpecificationCategory, SpecificationProperty) REFERENCES SpecificationProperties (SpecificationCategory, Id) + CONSTRAINT PK_ProductsSpecifications PRIMARY KEY (ProductType, ProductBrand, ProductSerie, ProductId, Specification), + CONSTRAINT FK_ProductsSpecifications_Products FOREIGN KEY (ProductType, ProductBrand, ProductSerie, ProductId) REFERENCES Products (ProductType, ProductBrand, ProductSerie, Id) ); DROP TABLE ProductTypes; DROP TABLE ProductBrands; DROP TABLE ProductSeries; DROP TABLE Products; -DROP TABLE SpecificationCategories; -DROP TABLE SpecificationProperties; DROP TABLE ProductsSpecifications;