Schema

線上市場的數據庫模式

  • February 15, 2018

我只是尋求建議。我有這個數據庫。每種產品類型都有自己的一組特徵。最大的問題是當有人添加新的產品類型時,還需要創建具有產品特徵的新表。我只能看到一個沒有 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 ║
║ 烤箱托盤 ║ 用途 ║ 餅乾 ║
║ 吸塵器 ║ 製造商 ║ 胡佛 ║
║ 吸塵器 ║ 目的 ║ 清潔地板 ║
╚═════════════════╩═══════════════════╩═════════════════╝

引用自:https://dba.stackexchange.com/questions/197976