在開放架構方案中,您需要用事先不知道或因實體類型而異的屬性集來維護實體。應用程序的用戶動態定義這些屬性。您將屬性拆分到不同的行中,並且只為每個實體實例存儲相關的屬性,而不是在表中預定義很多列並存儲很多空值。
PIVOT 使您可以為開放架構和其他需要將行旋轉為列的方案生成交叉分析報表,並且可能同時計算聚合並且以有用的形式呈現數據。
開放架構方案的一個示例是跟蹤可供拍賣的項目的數據庫。某些屬性與所有拍賣項目有關,例如,項目類型、項目的制造日期以及它的初始價格。只有與所有項目有關的屬性被存儲在 AuctionItems 表中:
CREATE TABLE AuctionItems
(
itemid INT NOT NULL PRIMARY KEY NONCLUSTERED,
itemtype NVARCHAR(30) NOT NULL,
whenmade INT NOT NULL,
initialprice MONEY NOT NULL,
/* other columns */
)
CREATE UNIQUE CLUSTERED INDEX idx_uc_itemtype_itemid
ON AuctionItems(itemtype, itemid)
INSERT INTO AuctionItems VALUES(1, N'Wine', 1822, 3000)
INSERT INTO AuctionItems VALUES(2, N'Wine', 1807, 500)
INSERT INTO AuctionItems VALUES(3, N'Chair', 1753, 800000)
INSERT INTO AuctionItems VALUES(4, N'Ring', -501, 1000000)
INSERT INTO AuctionItems VALUES(5, N'Painting', 1873, 8000000)
INSERT INTO AuctionItems VALUES(6, N'Painting', 1889, 8000000)
其他屬性特定於項目類型,並且不同類型的新項目被不斷地添加。這樣的屬性可以存儲在不同的 ItemAttributes 表中,其中每個項屬性都存儲在不同的行中。每個行都包含項目 ID、屬性名稱和屬性值:
CREATE TABLE ItemAttributes
(
itemid INT NOT NULL REFERENCES AuctionItems,
attribute NVARCHAR(30) NOT NULL,
value SQL_VARIANT NOT NULL,
PRIMARY KEY (itemid, attribute)
)
INSERT INTO ItemAttributes
VALUES(1, N'manufacturer', CAST(N'ABC' AS NVARCHAR(30)))
INSERT INTO ItemAttributes
VALUES(1, N'type', CAST(N'Pinot Noir' AS NVARCHAR(15)))
INSERT INTO ItemAttributes
VALUES(1, N'color', CAST(N'Red' AS NVARCHAR(15)))
INSERT INTO ItemAttributes
VALUES(2, N'manufacturer', CAST(N'XYZ' AS NVARCHAR(30)))
INSERT INTO ItemAttributes
VALUES(2, N'type', CAST(N'Porto' AS NVARCHAR(15)))
INSERT INTO ItemAttributes
VALUES(2, N'color', CAST(N'Red' AS NVARCHAR(15)))
INSERT INTO ItemAttributes
VALUES(3, N'material', CAST(N'Wood' AS NVARCHAR(15)))
INSERT INTO ItemAttributes
VALUES(3, N'padding',