Schema
線上市場的數據庫模式
我只是尋求建議。我有。每種產品類型都有自己的一組特徵。最大的問題是當有人添加新的產品類型時,還需要創建具有產品特徵的新表。我只能看到一個沒有 DBA 的解決方案,將所有產品特性保存在一張表中,但這並不好。
“實體-屬性-值”或 EAV 設計模式允許您在不修改數據庫結構的情況下為產品創建新屬性。
Aaron Bertrand在 SQLBlog.org上有一篇關於這種設計的優點和缺陷的優秀文章。
一個簡化的例子,根據您的要求:
CREATE TABLE dbo.Products ( ProductID int NOT NULL CONSTRAINT PK_Products PRIMARY KEY CLUSTERED IDENTITY(1,1) , ProductName nvarchar(100) NOT NULL ); CREATE TABLE dbo.AttributeTypes ( AttributeTypeID int NOT NULL CONSTRAINT FK_AttributeTypes PRIMARY KEY CLUSTERED IDENTITY(1,1) , AttributeTypeName nvarchar(100) NOT NULL ); CREATE TABLE dbo.ProductAttributes ( ProductAttributeID int NOT NULL CONSTRAINT PK_ProductAttributes PRIMARY KEY CLUSTERED IDENTITY(1,1) , ProductID int NOT NULL CONSTRAINT FK_ProductAttributes_ProductID FOREIGN KEY REFERENCES dbo.Products(ProductID) , AttributeTypeID int NOT NULL CONSTRAINT FK_ProductAttributes_AttributeTypeID FOREIGN KEY REFERENCES dbo.AttributeTypes(AttributeTypeID) , AttributeValue nvarchar(100) NOT NULL );
這將插入一些範例數據:
INSERT INTO dbo.Products (ProductName) VALUES ('Oven Trays') , ('Cars') , ('Vacuum Cleaners'); INSERT INTO dbo.AttributeTypes (AttributeTypeName) VALUES ('Manufacturer') , ('purpose') , ('diameter'); INSERT INTO dbo.ProductAttributes (ProductID, AttributeTypeID, AttributeValue) VALUES (1, 1, 'Farberware') , (2, 1, 'General Motors') , (3, 1, 'Hoover') , (1, 2, 'cookies') , (2, 2, 'driving') , (3, 2, 'cleaning floors') , (1, 3, '12"');
這顯示了我們如何獲得所需的輸出:
SELECT p.ProductName , att.AttributeTypeName , pa.AttributeValue FROM dbo.Products p INNER JOIN dbo.ProductAttributes pa ON p.ProductID = pa.ProductID INNER JOIN dbo.AttributeTypes att ON pa.AttributeTypeID = att.AttributeTypeID ORDER BY p.ProductName , att.AttributeTypeName;
╔═════════════════╦═══════════════════╦═════════════════╗ ║ 產品名稱 ║ 屬性類型名稱 ║ 屬性值 ║ ╠═════════════════╬═══════════════════╬═════════════════╣ ║ 汽車 ║ 製造商 ║ 通用汽車 ║ ║汽車║目的║駕駛║ ║ 烤箱托盤 ║ 直徑 ║ 12" ║ ║ 烤箱托盤 ║ 製造商 ║ Farberware ║ ║ 烤箱托盤 ║ 用途 ║ 餅乾 ║ ║ 吸塵器 ║ 製造商 ║ 胡佛 ║ ║ 吸塵器 ║ 目的 ║ 清潔地板 ║ ╚═════════════════╩═══════════════════╩═════════════════╝