依赖于另一个值的值的数据库架构

Database schema for values that are dependent on another value

我想做的是将此数据输入数据库以用于用户表单。

例如,如果用户在产品下拉列表中选择产品 A,则样式下拉列表将仅填充适用于产品 A 的样式,并选择默认样式。颜色下拉列表只会显示与该样式对应的颜色。所以基本上我在这里拥有的是依赖于另一个值的值。颜色列表取决于样式,样式又取决于产品类型。

这个场景的合理数据库模式是什么?我已经绞尽脑汁好几天了,非常感谢您的指导。

产品类型(A、B、C、D、E)

产品 A 和 B

有以下款式:

样式 1

样式 2(默认)

样式 3

产品 C 和 D

有以下款式:

样式 4(默认)

样式 5

产品 E

只有一种款式:

样式 6

样式 7(默认)

注意:每个样式都有自己独特的一组颜色

注意:每个产品都有一个默认样式

如果你想让事情简单化:

CREATE TABLE products (
    id serial NOT NULL,
    CONSTRAINT pk_products
        PRIMARY KEY (id)
);
CREATE TABLE styles (
    id serial NOT NULL,
    product_id integer NOT NULL,
    CONSTRAINT pk_styles
        PRIMARY KEY (id),
    CONSTRAINT fk_styles_id 
        FOREIGN KEY (product_id)
        REFERENCES products (id) MATCH SIMPLE
        ON UPDATE CASCADE ON DELETE CASCADE
);
CREATE TABLE colors (
    id serial NOT NULL,
    style_id integer NOT NULL,
    CONSTRAINT pk_colors
        PRIMARY KEY (id),
    CONSTRAINT fk_colors_id 
        FOREIGN KEY (style_id)
        REFERENCES styles (id) MATCH SIMPLE
        ON UPDATE CASCADE ON DELETE CASCADE
);

如果你想让它更复杂,你可以尝试避免重复(即重复使用颜色等),但这完全取决于你。

考虑以下数据库模式:

1) Table_Product:Product_ID,Product_Name(所有产品列表)。

2) Table_Style: Style_ID, Style_Name (所有样式列表)

3) Table_Color: Color_ID, Color_Name(所有颜色列表)

4) Table_Product_Style: Product_ID, Style_ID, IsDefault(每个产品的产品和风格与默认风格的映射)

5) Table_Style_Color: Style_ID, Color_ID(样式和颜色映射)

6) Table_User_Preference: User_ID, Product_ID, Style_ID, Color_ID.

这是逻辑设计,您应该可以将其直接翻译成 SQL 方言。

注意这里的所有内容都不为空。


产品 (PROD_NAME) 存在。

Product {PROD_NAME}
    KEY {PROD_NAME}


存在样式(STYLE_NO)。

Style {STYLE_NO}
  KEY {STYLE_NO}


颜色(CLR_NAME)存在。

Colour {CLR_NAME}
  KEY  {CLR_NAME}


样式 (STYLE_NO) 有颜色 (CLR_NAME)。

对于每种款式,该款式可能有不止一种颜色可供选择。 对于每种颜色,该颜色可能有不止一种款式。

如果一种样式有一种颜色,则该样式必须存在并且该颜色必须存在。

StyleColour {STYLE_NO, CLR_NAME}
        KEY {STYLE_NO, CLR_NAME}

FOREIGN KEY {STYLE_NO} REFERENCES Style  {STYLE_NO}
FOREIGN KEY {CLR_NAME} REFERENCES Colour {CLR_NAME}


产品 (PROD_NAME) 有款式 (STYLE_NO)。

对于每件产品,该产品可能有多种款式。对于每种款式,该款式可能有不止一种产品。

如果产品有某种款式,则该产品必须存在且该款式必须存在。

ProductStyle {PROD_NAME, STYLE_NO}
         KEY {PROD_NAME, STYLE_NO}

FOREIGN KEY {PROD_NAME} REFERENCES Product {PROD_NAME}
FOREIGN KEY {STYLE_NO}  REFERENCES Style   {STYLE_NO}


样式 (STYLE_NO) 是产品 (PROD_NAME) 的默认样式

每个产品最多有一个默认样式;对于每种样式,可能不止一种产品默认使用该样式。

如果某种款式是产品的默认款式,则该款式必须提供该款式。

DefaultProductStyle {PROD_NAME, STYLE_NO}
                KEY {PROD_NAME} 

FOREIGN KEY {PROD_NAME, STYLE_NO}  REFERENCES ProductStyle {PROD_NAME, STYLE_NO}