什么是使用多种变体产品设计数据库的最佳方法?

iOS*_*com 1 mysql database oracle database-design relational-database

这个问题与这个问题有关:在数据库中存储产品颜色的最佳方法

所以我有一个具有多个属性的产品.下面是一个例子.

产品A.

Name: Product A v1.0, Product A v2.0 (2 versions of Product A)
Color: Black, White, Blue
Capacity: 16MB, 32MB, 64MB
Carrier: T-Mobile, Digicel, Vonage
Run Code Online (Sandbox Code Playgroud)

此产品只能拥有每个属性中的一个.例如:黑色32MB,Vonage产品A v2.0

我不确定如何在规范化数据库中设置此产品.我是否为产品名称,颜色,容量和载体创建单独的表格,然后在产品A v1.0和颜色,产品A v1.0和容量,产品A v1.0和运营商等之间创建链接表?

我也不确定,因为产品A v1.0仅提供16MB黑/白,而v2.0提供所有颜色,所有容量和仅一个蜂窝载体.我可以继续其他微小的变化.

Dan*_* A. 6

以下是我将如何链接Oracle中的产品和颜色的示例(更新以显示如何在具有单独唯一键的产品上创建主键):

CREATE TABLE product_color (
    color_name VARCHAR2(100),
    CONSTRAINT color_pk PRIMARY KEY (color_name)
);

CREATE TABLE product (
    product_id NUMBER,
    product_name VARCHAR2(100),
    color_name VARCHAR2(100),
    CONSTRAINT product_pk PRIMARY KEY (product_id),
    CONSTRAINT color_fk FOREIGN KEY (color_name) 
        REFERENCES product_color (color_name),
    CONSTRAINT product_uk UNIQUE (product_name, color_name)
);
Run Code Online (Sandbox Code Playgroud)

这基本上创建了值表的外键.如果您尝试插入不在product_color表中的颜色或无效文本,则约束将阻止它.

现在,我可以进一步规范化,并将每个颜色的整数键关联起来,并为整数创建一个外键.但是,这种类型的规范化将导致SQL语句中的大量连接,尤其是当您开始添加其他属性时.我发现这种方式对于更清晰的SQL来说是一个很好的妥协.