Purchasing
所有数据管道图都显示每个不同的业务单元或特定工作范围(在本例中为、Sales
、 )都有多个数据集市Inventory
。
鉴于以下两个选项:
选项 A:
car-db
|_ Databases
|_ carDataMarts
|_ dbo.fact_purchase_x
|_ dbo.dim_purchase_y
|_ dbo.dim_purchase_z
|_ dbo.fact_sales_x
|_ dbo.dim_sales_y
|_ dbo.dim_sales_z
|_ dbo.fact_inventory_x
|_ dbo.dim_inventory_y
|_ dbo.dim_inventory_z
选项 B
car-db
|_ Databases
|_ car_purchase_DataMart
|_ dbo.fact_purchase_x
|_ dbo.dim_purchase_y
|_ dbo.dim_purchase_z
|_ car_sales_DataMart
|_ dbo.fact_sales_x
|_ dbo.dim_sales_y
|_ dbo.dim_sales_z
|_ car_inventory_DataMarts
|_ dbo.fact_inventory_x
|_ dbo.dim_inventory_y
|_ dbo.dim_inventory_z
- 该图将如何转化为数据集市的实际实施(选项 A 或 B)?
- 选项 A 和 B 在性能或可用性方面应该存在某种差异,如果是,这些差异是什么?
PS:使用 MS SQL
请记住,Google 的这个示例是关于数据仓库/OLAP 设计实现的,它非常适合报告(通常是聚合性质的),特别是使临时报告对消费者最灵活。但是,如果您计划在其之上构建可以读取单个行并将数据写回表的应用程序,那么对于 OLTP 系统来说,这不是一个理想的设计。
该图在技术上转换为选项 B,因为它为每个数据集市使用数据库的符号。但是对于这个特定的例子,我不一定同意这种类型的设计,其中数据可能在这些数据库之间有很强的关系。
Sales
,Purchasing
, 和Inventory
通常是密切相关的,并且很可能希望同时报告,即使从 OLAP 的角度来看也是如此。虽然将事物分离到不同的数据库中不一定是一件坏事,但对于这种高度相关的数据库对象来说并没有多大意义,而且在 SQL Server 中这样做也有一些小缺点。一个缺点是您需要在每个数据库中单独管理安全性,并且需要为需要同时从多个域查询对象(例如
Sales
vsPurchasing
)的用户进行适当的设置。因为即使您在数据库中创建了一个从Sales
数据库中引用表的视图,除非他们在两个数据库中都Purchase
具有读取权限,否则任何人都无法使用该视图。有一种替代解决方案可以解决此问题,称为跨数据库所有权链接,但通常强烈建议不要启用此功能。相反,我会亲自将这 3 个域(
Sales
、Purchasing
和Inventory
)放在同一个数据库中,但每个域都在自己的架构下,如下所示:这允许您按域组织事物,并且如果需要,您可以按域在架构上按域在粒度级别管理权限,但您不需要这样做,也可以在数据库级别一起管理它们。
我不相信上述任何选项之间在性能方面存在任何差异(我的建议使用模式是选项 C)。在这方面,SQL Server 并不真正关心您是否跨数据库或模式查询对象。在可用性方面,我会推迟到我在前面的段落中讨论过的关于管理权限的内容。