数据仓库之父 Bill Inmon 将数据仓库描述为一个面向主题的、集成的、稳定的、反应历史变化的数据集合,用于支持管理者的决策过程。
从上面的引言里面,我们其实可以知道主题在数仓建设里面绝对是很重要的一环,这的确是的。数仓在建设过程中,对数据的组织管理上,不仅仅要进行横向的分层,也需要根据业务情况进行纵向的主题域划分。看到这里可能就有疑问了,上面明明说的是面向主题,怎么又突然说到主题域了,这里就延伸出主题和主题域的关系了。
下面我就围绕数仓主题、主题域以及两者之间关系、划分方式等,进行更详细的阐述。

数仓主题(Subject) 是在较高层次上将企业信息系统中某一分析对象(重点是分析的对象)的数据进行整合、归类并分析的一种范围,属于一个抽象概念,简单点说每一个主题对应一个宏观分析领域。
下面举例说明一下:对于一个erp系统而言,"销售分析"就是一个分析领域,这个"销售分析"所涉及到的分析对象有商品、供应商、顾客、仓库等,那么数仓主题就确定为商品主题、供应商主题、顾客主题、仓库主题,"销售分析"就可以作为一个主题域;
如果"产品分析"是一个分析领域,"产品分析"所涉及到的分析对象为商品、地域、时间、类别等,那么数仓的主题可以确定为商品主题、地域主题、时间主题、类别主题,"产品分析"可以作为一个主题域。
主题域通常是联系较为紧密的数据主题的集合,可以根据业务的关注点,将这些数据主题划分到不同的主题域,这种划分个人感觉与Kimball思想更为相似,自下而上的方式,根据业务需求分析视角进行划分。
其实这里市面上,也有一些不同的描述,上面对主题域的描述被归于集合论,还有一种叫做是边界论,这里稍微扩展下:
边界论的论点是 “主题域是对某个主题进行分析后确定的主题的边界“,这点个人感觉和 Inmon 指导思想类似,理清主题之间的边界,由ER模型进行逻辑转化,对某一主题域的分析,需要先确定这个主题的关系边界,然后再进行逻辑建模。
我的话觉得两者并不矛盾,只是所站的视角不同,边界论是先从细微处也就是微观延伸到宏观,而集合论则是从宏观到微观的过程。
主题的划分和设计是对主题域进一步的分解,细化的过程。主题域下面可以有多个主题,主题还可以划分成更多的子主题,主题和主题之间的建设可能会有交叉现象,而实体则是不可划分的最小单位。
主题域、主题、实体的关系如下图所示:

可以显而易见的看出,主题域是一个更大的概念,主题是略次之,实体最小,这里的实体表示的是实体对象(对应企业中某一宏观分析领域所涉及的分析对象),我的理解在维度建模的方法论上也可以说实体和维度某些概念是相似的。
在进行数据仓库设计时,一般是先基于一个主题或某部分主题进行优先建设,所以在大多数数据仓库的设计过程中都有一个主题域的选择过程,主题域的确定必须由最终用户和数据仓库的设计人员共同完成。
而在划分主题域时,大家的切入点不同可能会造成一些争论、重构等的现象,考虑的方法有下面一些:
按照所属系统划分:业务系统有几种,就划分几种

比如一个靠销售广告位置的门户网站主题域可能会有广告域,客户域等,而广告域可能就会有广告的库存,销售分析、内部投放分析等主题;

比如公司里面的人力、财务、销售、运营等,运营域中可能会有工资支出分析、活动宣传效果分析等主题。

在某些行业,比如电信、金融都是最早建设数仓的行业,都有一些规范,比如IBM 公司的 BDWM 九大金融主题模型,Teradata 公司的 FS-LDM 十大金融主题模型,都是行业应用比较广泛的标准,如果是这两个行业就可以参考构建自己的企业数据仓库模型规范。


总而言之,切入的出发点逻辑不一样,就可以存在不同的划分逻辑。在建设过程中可采用迭代方式,不纠结于一次完成所有主题的抽象,可先从明确定义的主题开始,后续逐步归纳总结成自身行业的标准模型。
在很多文档上都有说数据域,反而没有主题域的概念,那数据域到底是什么,又和主题域什么关系呢?
我自己在网上也搜索了很多,也没查到对两者的来源和区别说明让我满意的,但是我在看《阿里大数据之路》和 阿里的官方相关文档 介绍上,看到了这个词,下面可以看下引用的阿里对数据域的介绍:
数据域是指面向业务分析,将业务过程或者维度进行抽象的集合。为保障整个体系的生命力,数据域需要抽象提炼,并长期维护更新。在划分数据域时,既能涵盖当前所有的业务需求,又能让新业务在进入时可以被包含进已有的数据域或扩展新的数据域。数据域的划分工作可以在业务调研之后进行,需要分析各个业务模块中有哪些业务活动。

我个人理解其实主题域和数据域差异不大,在实际过程中可以把主题域和数据域都当做一种域来处理了,不必纠结。
当我我也查到网上,有人总结的一段话,是将两者描述为一种包含关系,姑且可以看下:
主题域:面向业务过程,将业务活动事件进行抽象的集合,如下单、支付、退款都是业务过程,针对公共明细层(DWD)进行主题划分。数据域:面向业务分析,将业务过程或者维度进行抽象的集合,针对公共汇总层(DWS)进行数据域划分。
为保证整个数仓体系的生命力,数据域需要抽象提炼,长期维护及更新,但不要轻易变动,在划分数据域时,既能涵盖当前所有的业务需求,又能在新业务接入时无影响的包含进已有的数据域中或者扩展出新的数据域,这是划分的一个准则。
特别说明的是,主题域是无法一次划分完整的,在大多数数据仓库的设计过程中都有一个主题域的选择过程。业务一直发展的,设计之初就想着一次把所有主题全部划分完整,是不太可能,也不太适用的,我们可以遵循上面说的划分主题域的准则,以不断迭代的方式进行。
以马蜂窝订单交易模型的建设为例,基于业务生产总线的设计是常见的模式,首先调研订单交易的完整过程,定位过程中的关键节点,确认各节点上发生的核心事实信息。


网易云音乐将一级主题域划分为参与者、服务及产品,版权及协议、公共、事实这5个大的主题域,二级细节分类按照业务过程抽象获得。

之前在一家互联网医疗公司工作,主题域的划分是按照部门bu进行划分的,这种方式适合较大的集团公司,各个事业部或者业务交叉不大的,不同的bu使用不同的数据域,这种架构它是一种小型的、部门级数据仓库,企业的不同部门有不同的 “主题域”,因而就有不同的独立性数据集市。
实际操作是按照部门划分了独立的数据集市,也就是主题域之后,再利用业务过程抽象出细分的主题。

独立型数据集市的实质,是为了满足企业内各部门的分析需求而建立的微型数据仓库。有些企业在实施数据仓库项目时,为了节省投资,尽快见效,针对不同部门的需要,分步建立起这类数据集市,以解决一些较为迫切的问题。
但是,当多个独立的数据集市增长到一定规模后,由于没有统一的数据仓库协调,企业只会又增长出一些新的信息孤岛,仍然不能以整个企业的视角来分析数据,所以就延伸出另外一种企业级的数据仓库架构,后面有时间再单独分析这块。
结合我参与过的数仓项目建设经验和踩过的坑,对于数仓主题、主题域划分个人比较推荐按照业务系统划分或者bu部门来划分主题域(一级主题),这样的话边界较为清晰,数据仓库开发过程也不会因为模型主题的归属引发扯皮和不同意见,然后根据各个系统中的业务过程抽象整合出主题(叫二级主题域也可以)。
数仓建设是一整套方法论,但方法论不一定是真理,每个公司都有自己的业务场景及需求,方法论或别人的方案不一定适用自己的公司,我们需要学习利用这些方法论,然后结合自己公司实际的业务场景来制定自己的主题及主题域划分规范。
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
我希望将Favorite模型添加到我的User和Link模型。业务逻辑用户可以有多个链接(即可以添加多个链接)用户可以收藏多个链接(他们自己的或其他用户的)一个链接可以被多个用户收藏,但只有一个所有者我对如何为这种关联建模以及在模型就位后如何创建用户收藏夹感到困惑?classUser 最佳答案 下面的数据模型怎么样:classUser:destroyhas_many:favorite_links,:through=>:favorites,:source=>:linkendclassLink:destroyhas_many:favor
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试使用Curbgem执行以下POST以解析云curl-XPOST\-H"X-Parse-Application-Id:PARSE_APP_ID"\-H"X-Parse-REST-API-Key:PARSE_API_KEY"\-H"Content-Type:image/jpeg"\--data-binary'@myPicture.jpg'\https://api.parse.com/1/files/pic.jpg用这个:curl=Curl::Easy.new("https://api.parse.com/1/files/lion.jpg")curl.multipart_form_
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
在应用开发中,有时候我们需要获取系统的设备信息,用于数据上报和行为分析。那在鸿蒙系统中,我们应该怎么去获取设备的系统信息呢,比如说获取手机的系统版本号、手机的制造商、手机型号等数据。1、获取方式这里分为两种情况,一种是设备信息的获取,一种是系统信息的获取。1.1、获取设备信息获取设备信息,鸿蒙的SDK包为我们提供了DeviceInfo类,通过该类的一些静态方法,可以获取设备信息,DeviceInfo类的包路径为:ohos.system.DeviceInfo.具体的方法如下:ModifierandTypeMethodDescriptionstatic StringgetAbiList()Obt
本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01 客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02 数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit
文章目录一、概述简介原理模块二、配置Mysql使用版本环境要求1.操作系统2.mysql要求三、配置canal-server离线下载在线下载上传解压修改配置单机配置集群配置分库分表配置1.修改全局配置2.实例配置垂直分库水平分库3.修改group-instance.xml4.启动监听四、配置canal-adapter1修改启动配置2配置映射文件3启动ES数据同步查询所有订阅同步数据同步开关启动4.验证五、配置canal-admin一、概述简介canal是Alibaba旗下的一款开源项目,Java开发。基于数据库增量日志解析,提供增量数据订阅&消费。Git地址:https://github.co