【问题标题】:Database schema for values that are dependent on another value依赖于另一个值的值的数据库架构
【发布时间】:2017-01-05 17:09:38
【问题描述】:

我要做的是将此数据输入数据库以在用户表单上使用。

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

在这种情况下,合理的数据库架构是什么?我已经绞尽脑汁好几天了,不胜感激。

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

产品 A 和 B

有以下款式:

样式 1

样式 2(默认)

样式 3

产品C&D

有以下款式:

样式 4(默认)

样式 5

产品 E

只有一种风格:

样式 6

样式 7(默认)

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

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

【问题讨论】:

    标签: sql database-design dependencies database-schema


    【解决方案1】:

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

    请注意,这里的所有内容都不是 NULL。


    产品 (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}
    

    【讨论】:

    • 这个方案一共有6个表吗?产品、样式、颜色、StyleColor、ProductStyle 和 DefaultProductStyle。
    • @SalvatoreLibrizzi,是的六个——前三个主要是用于定义产品、样式和颜色域的“静态数据”。
    • 这个解决方案与鲍里斯给出的解决方案相比有什么优点/缺点吗?
    • @SalvatoreLibrizzi 看看约束。我认为我和鲍里斯阅读业务规则的方式不同。我在该模型中看不到如何将style = 2product = Aproduct = B 关联。 (样式 1,3 相同);也用于将样式 4,5 与产品 C,D 关联?在该模型中,每种样式都可以与一个产品相关联。颜色也一样。我想这取决于你如何使用逻辑,tie-narrow-redtie-wide-red 的红色是否不同?
    • @SalvatoreLibrizzi;添加了模型图像,也许这样更容易理解。
    【解决方案2】:

    如果你想保持简单:

    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
    );
    

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

    【讨论】:

    • 感谢鲍里斯的快速回复!几个问题......所以在这个模式中,样式表中会有多个条目用于相同的样式,因为一个样式可能属于多个产品。正确的?那么我感到困惑的是,您可能有一种特定颜色引用一种样式,但它可能是该特定样式的多个条目。
    • 举个例子:我是你的客户,我买了一条领带。按照您保存color_id=3965 的顺序。在颜色中,您可以找到该 ID - 它是 pink checked 引用 style_id=2038。在样式中,您可以找到此 ID - 它是 narrow 引用 product_id=706。产品中的此 ID 表示它是 tie。但是如果我们返回:tie 可能有两种样式(usualnarrow)并且每种样式都可以有颜色(usual:redyellow with stripespurple dottednarrowredpink checked)。两种样式都有red,但它是不同的红色,专门为每种样式定义。
    【解决方案3】:

    考虑以下数据库架构:

    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。

    【讨论】:

      猜你喜欢
      • 2017-05-24
      • 1970-01-01
      • 2020-09-14
      • 1970-01-01
      • 2015-03-19
      • 2016-10-22
      • 2015-04-18
      • 1970-01-01
      • 2022-12-03
      相关资源
      最近更新 更多