我需要为一家制药公司解决一个练习,他们要求我根据一些信息从头开始创建一个数据库结构。
因为我希望它具有可扩展性且“面向未来”,所以我决定遵循该star/snowflake
结构。现在它看起来比雪花更像明星,但想法就在那里。我有一个关于主事实表(研究)以及如何表示维度表状态的特定问题。
我想出了2个选项:
- 选项 1:事实表研究> 外键 > 维度表合同> 外键 > 维度表状态。
所以我们通过两个维度表来表示事实表上的状态。我将通过 a JOIN
in aview
或其他方式做到这一点...
- 选项 2:事实表研究> 外键 > 维度表状态。
这样,我们将事实表(研究)直接链接到维度表状态。
我应该选择选项 1还是选项 2?
我害怕将太多维度表链接到事实表。这是我第一次尝试创建数据库结构。
欢迎任何建议,欢迎任何建议,尤其是来自经验丰富的数据库架构师和业余爱好者的建议。
谢谢
编辑:添加更多信息
谢谢@AntC 的提问。事实上,这根本不是一个数据仓库场景,而是一家制药公司需要一个新软件来跟踪他们的临床试验的场景。
但当然,最著名的模式是 Star/Snowflake,我不想使用任何分层模式。同时我想避免三角形、菱形、圆形之类的形状,因为即使现在只有 100 个用户知道这个数据库在 10 年后会是什么样子。这个想法是长期塑造一些东西,据我所知,我认为星形/雪花形状也适合正常应用。
在选项 2
Status_Code
中,在两个表中显示为非键:Study
,Contract
. 但它属于哪些实体?这些实体的相对基数是什么?查看选项 1,
Status_Code
属于Contract
;Study
给定的 s可以有多个Contract
。因此,如果您要采用选项 2,您会让 OLTP 头疼:每当 a 发生变化时
Status
,Contract
事务处理都需要将该变化复制到所有Study
s,从而存在明显不同步的风险。这称为更新异常。像选项 2 这样的非规范化模型在数据仓库中是合法的,因为我们想要快速报告。由于处理成本和维护数据同步的风险,在面向事务处理的数据模型中是不明智的。
因此,对于专注于事务处理的应用程序,指示选项 1。是的,您将创建一个
Join
视图Study
>Contract
>Status
。