我有一个数据库结构,实现了一个简单的EAV模型(见图片)。我的产品有一个类型,通过连接表限制可用于此产品的属性名称,这很清楚。但是,当我添加prop_values表来存储每个产品的属性值时,问题就来了。它通过prod_sku引用到products,并通过prop_id引用到prop_names。在此情况下,用户可以将任何属性添加到任何产品中,即使不允许该产品类型的属性也可以添加。此外,还可能存在重复,即单个产品有两个或多个相同的属性。有没有办法在数据库级别上限制这些?在@BillKarvin的回答之后,我尝试了下面的CREATE代码,但在创建最后一个表(property_values)时出现“外键约束格式不正确”的错误。我发现了我的错误-忘记向产品表添加关键字。以下是我的代码经过更正后的版本(可运行)。
CREATE TABLE product_types (
id INT PRIMARY KEY,
product_type varchar(50) NOT NULL,
block_css_id varchar(50) NOT NULL,
block_description varchar(50) NOT NULL
);
CREATE TABLE products (
sku varchar(50) PRIMARY KEY,
name varchar(50) NOT NULL,
price decimal(20,2) unsigned NOT NULL,
id_product_type INT NOT NULL,
FOREIGN KEY (id_product_type) REFERENCES product_types (id),
KEY (sku, id_product_type)
);
CREATE TABLE property_names (
id INT PRIMARY KEY,
property_name varchar(50) NOT NULL,
property_css_id varchar(50) NOT NULL,
property_input_name varchar(50) NOT NULL
);
CREATE TABLE junction_ptype_propname (
id_productt_type INT NOT NULL,
id_property_name INT NOT NULL,
PRIMARY KEY (id_productt_type, id_property_name),
FOREIGN KEY (id_productt_type) REFERENCES product_types (id),
FOREIGN KEY (id_property_name) REFERENCES property_names (id)
);
CREATE TABLE property_values (
id INT NOT NULL PRIMARY KEY,
product_sku varchar(50) NOT NULL,
property_id INT NOT NULL,
property_value decimal(20,2) NOT NULL DEFAULT 0.00,
id_prod_type INT NOT NULL,
UNIQUE KEY (product_sku, property_id),
FOREIGN KEY (product_sku, id_prod_type) REFERENCES products (sku, id_product_type),
FOREIGN KEY (property_id, id_prod_type) REFERENCES junction_ptype_propname (id_property_name, id_productt_type)
);