為關係數據庫設計星型模式
我是數據倉庫的新手,我一直在閱讀有關這些原則的文章和影片,但我對如何採用下面的設計並將其轉換為星型模式感到有些困惑。在這個例子中,我假設事實表是 (order-orderitem-book) 而度量是 (category-customer-time) 我的問題是關於書籍作者我們如何把它作為度量?是否允許在星型模式中放置多對多關係?如果我錯了,如何將星型模式繪製到這個關係數據庫?
您可以在數據倉庫中放置多對多關係,但許多人認為這樣做是不好的做法——即使某些數據倉庫工具根本不允許創建它。以下是我如何根據您的設計創建星型模式:
由於您的
Author
表格和Category
表格只有一個有價值的屬性(名稱),因此我會將它們滾動到Book
表格中,然後該表格將成為您的第一個維度。Customer
表格可以保持原樣,也可以成為一個維度。然後,您可以將這兩個Order
表合二為一,並創建一個Order
包含OrderID
,Date
,BookID
,CustomerID
,Price
- 的事實表,如下所示:CREATE TABLE DimBook ( BookID INT NOT NULL PRIMARY KEY, Author VARCHAR(50) NOT NULL, Category VARCHAR(50) NOT NULL, Title VARCHAR(50) NOT NULL, ISBN VARCHAR(50) NOT NULL, Year SMALLINT NOT NULL, Price DECIMAL(9,2) NOT NULL, NoPages SMALLINT NOT NULL, Description VARCHAR(100) NOT NULL ); CREATE TABLE DimCustomer ( CustomerID INT NOT NULL PRIMARY KEY, FirstName VARCHAR(50) NOT NULL, LastName VARCHAR(50) NOT NULL, ZipCode VARCHAR(20) NOT NULL, City VARCHAR(50) NOT NULL, State VARCHAR(50) NOT NULL ); CREATE TABLE FactOrders ( OrderID INT NOT NULL, "Date" DATETIME NOT NULL, BookID INT NOT NULL REFERENCES DimBook(BookID), CustomerID INT NOT NULL REFERENCES DimCustomer(CustomerID), Price DECIMAL(9,2) NOT NULL );
您可能還想考慮一個
Date
在星型模式和數據倉庫中也常見的維度,以便更輕鬆地按日期搜尋。一個非常基本的實現如下:CREATE TABLE DimDate ( "Date" DATETIME NOT NULL PRIMARY KEY, "Year" SMALLINT NOT NULL, "Month" TINYINT NOT NULL, "Day" TINYINT NOT NULL );
然後,只需將
Date
事實表中屬性的外鍵添加到表中的Date
鍵中DimDate
。這會產生類似的東西:如果您需要處理一本書可能有許多作者的情況(這種情況經常發生),有幾種方法可以做到這一點。
第一個,也是我的建議,是讓所有作者都在
Author
屬性中。這將允許您輕鬆搜尋由相同作者組合撰寫的所有書籍。第二種方法將
Author
屬性非規範化為它自己的維度,然後由書籍維度引用。這將創建一個雪花模式(您的問題表明您想要一個星型模式,所以我避免了這種方法)並且在嘗試由多個作者搜尋時也會變慢。最終,這取決於您的確切需求和您試圖滿足的要求。我個人會堅持讓所有作者都具有相同的屬性,因為這是最簡單的設計並且符合您的星型模式要求。