Data-Warehouse

為關係數據庫設計星型模式

  • December 9, 2018

我是數據倉庫的新手,我一直在閱讀有關這些原則的文章和影片,但我對如何採用下面的設計並將其轉換為星型模式感到有些困惑。在這個例子中,我假設事實表是 (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屬性非規範化為它自己的維度,然後由書籍維度引用。這將創建一個雪花模式(您的問題表明您想要一個星型模式,所以我避免了這種方法)並且在嘗試由多個作者搜尋時也會變慢。

最終,這取決於您的確切需求和您試圖滿足的要求。我個人會堅持讓所有作者都具有相同的屬性,因為這是最簡單的設計並且符合您的星型模式要求。

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