database-design - 一个公司的不同业务的一个或多个事实表?
问题描述
我是数据库设计的新手。我正在尝试为汽车共享公司设计一个数据模型。他们有不止一种商业模式,比如汽车共享、踏板车共享、送货。
这是我的两难选择,我应该选择哪个:
(数据库仓库总线架构)我应该为不同的业务创建多个事实表吗?不同的事实表代表一种业务模型并共享一些一致的维度?
(一星模式)或者我应该将不同的业务名称(汽车共享、踏板车、交付)存储在一个维度表中,称为产品?
谢谢!!!!
解决方案
我的处理方式如下:
- 列出所有事实及其相关维度
- 确定所有事实中维度的共性水平
如果您的事实都具有大致相同的维度,那么您可以将它们全部放在一个事实表中。对此没有硬性规定,但我会说,如果一个事实有超过 2 个维度且未被其他事实使用(或被其他事实使用但未被该事实使用),那么它需要在它自己的事实表。
如果您决定可以将多个事实放在一个事实表中,那么它就变成了一个判断调用。做出决定时要考虑的事项包括(显然不是一个明确的清单):
- 您是否想在同一个查询中同时查询不同的事实?如果是这样,那么将它们放在 1 个事实表中会使这更容易,例如按日期按事实类型计数
- 您的数据量是否如此庞大(或将来可能如此)以至于只有一个事实表会导致问题?如果是这样,那么一开始就有单独的事实表,而不是将来必须拆分它们,这是有道理的
- 安全性:您是否需要限制对不同人群的不同事实的访问。如果是这样,那么拥有单独的事实表可能会使这更容易
我个人的偏好,假设同时查询不同的事实不是主要要求(上面的第一个要点),将使用单独的事实表。虽然涉及更多的 ELT,但它不应该很重要——一旦你为第一个事实表构建了逻辑,那么所有其他的都应该是“复制和粘贴”加上少量的编辑。拥有不同的事实表更灵活,并且可能会在未来给您带来更少的问题
推荐阅读
- git - 列出上次推送中更改的文件数/一次推送中的本地提交数
- python - 使用 fastjsonschema 编译 json 模式给出 TypeError: string indices must be integers
- angular - 如何使用具有特定日期格式的分组键作为分组键的管道分组
- javascript - Javascript onclick 函数似乎在 IE11/Edge/Chrome 中不起作用
- spring - @ControllerAdvice 不工作 Spring 5.1.6
- html - 具有 z-index:9 的 Div 保持在另一个 z-index 1 之下
- javascript - 在 FullCalendar 中移动事件时,结束值为 null
- sql-server - 如何将 OPENROWSET() 的输出定向到 INSERT 语句的参数?
- excel - DAX 公式查找 MIN 和 % 差异
- python - 如何通过迭代和弹出元素来获取列表元素的总和