AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 224520
Accepted
J. DOE
J. DOE
Asked: 2018-12-10 13:24:20 +0800 CST2018-12-10 13:24:20 +0800 CST 2018-12-10 13:24:20 +0800 CST

为关系数据库设计星型模式

  • 772

我是数据仓库的新手,我一直在阅读有关这些原则的文章和视频,但我对如何采用下面的设计并将其转换为星型模式感到有些困惑。在这个例子中,我假设事实表是 (order-orderitem-book) 而度量是 (category-customer-time) 我的问题是关于书籍作者我们如何把它作为度量?是否允许在星型模式中放置多对多关系?如果我错了,如何将星型模式绘制到这个关系数据库? 在此处输入图像描述

data-warehouse star-schema
  • 2 2 个回答
  • 1734 Views

2 个回答

  • Voted
  1. Best Answer
    World Wide DBA
    2018-12-10T14:43:28+08:002018-12-10T14:43:28+08:00

    您可以在数据仓库中放置多对多关系,但许多人认为这样做是不好的做法——即使某些数据仓库工具根本不允许创建它。以下是我如何根据您的设计创建星型模式:

    由于您的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属性非规范化为它自己的维度,然后由书籍维度引用。这将创建一个雪花模式(您的问题表明您想要一个星型模式,所以我避免了这种方法)并且在尝试由多个作者搜索时也会变慢。

    最终,这取决于您的确切需求和您试图满足的要求。我个人会坚持让所有作者都具有相同的属性,因为这是最简单的设计并且符合您的星型模式要求。

    • 1
  2. Rhys
    2018-12-10T15:09:37+08:002018-12-10T15:09:37+08:00

    所以你的问题是几个不同的问题 -

    1. Author不应该是它自己的维度,它只是Book维度的一个属性。

    2. 因为事实表的主键是由一组外键组成的复合键,所以每个具有多对多关系的表都必须表示为事实表。您将不得不使用桥接表,但实现这一点的最佳方式取决于您的需要。

    3. 我认为你的方法没有错,但只是为了帮助你澄清你在做什么,你会想要Order一个事实表,并且Book(我将作为属性移动并进入)Author(或与彼此)并在您的示例中作为尺寸。您所有的定量数据(除了)都应该进入,所有描述性和定性数据都应该进入您周围的维度。CategoryDateTimeDateTimeCustomerDateTimeOrder

    • 0

相关问题

  • 创建 MV 日志时是否需要枚举物化视图中使用的列?

  • 结合零售销售和支付 OLAP 多维数据集

  • 开源商业智能/DWH 解决方案 [关闭]

  • 数据仓库创建

  • 在数据仓库中实现多对多关系有哪些方法?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve