我作为软件工程师有多年的经验,并且在数据库方面做了大量工作,主要是Oracle和Postgres。我使用可能被称为数据库模式的非正式设计方法。我勾勒出类似E / R图的东西,然后我从那里生成DDL。随着时间的推移,我会随着更多要求的到来修改架构。 我在计算机科学的学术方面接受了严格的培训,并且我写了关于数据库主题的硕士和博士论文。我理解依赖关系,正常形式和分解方法。我发现这种模式设计方法在现实世界中完全没用。
我现在正在教授数据库系统的高级课程,我尽职尽责地介绍了关于模式设计的经典材料,包括依赖项,正规形式,分解。但我仍然不相信这种方法的实际价值。
这些理论主题的教科书讨论,从设计非常糟糕的模式开始,以及来自......嗯,我不知道的功能依赖性。他们只是在那里,然后他们引导您到更好的架构。但是从良好的实体/关系模型开始,您可能从一个非常好的模式开始。如果您了解您的实体是什么,以及它们的属性是什么 - 您基本上不是从已经在BCNF中的表开始的吗?
对于那些设计和维护模式的人,你真的使用依赖理论和普通形式吗?或者你就像我一样甩尾它?
答案 0 :(得分:3)
当我构建数据库时,我通常从一个好的ER模型开始。我需要这个来检查我对主题的理解。 在将ER模型转换为关系模型后,结果通常为3NF,通常在BCNF中。通常足够OLTP工作。 对于OLAP工作,我使用了星型模式设计。这充满了更新异常,我通过小心ETL处理。 我的看法。
答案 1 :(得分:3)
通常,对业务的深刻理解(通常通过详细阐述的概念建模获得)与不太缺乏设计实践经验相结合,足以在大多数用例中“从一开始就”获得5NF设计。因此,教科书通常说明/建议的“规范化程序”几乎从未实际实施过。应用这个程序是一种“自下而上”的方法,对于大多数练习设计师来说感觉非常不自然,他们非常喜欢“自上而下”从概念模型开始,这些概念模型通常已经完全按照你最终的方式“分解”应用规范化程序作为一种方法。
这并不意味着规范化理论本身可以走出窗外。它仍构成为什么某些设计比解决同一问题的其他替代设计“更好”的正式基础。
FD理论也是DBMS设计者应该知道的重要材料。例如,关系DBMS需要能够对关系表达式执行所谓的“键推断”(即,根据输入的键,计算哪些键的输出,例如JOIN,保证符合要求)。没有FD理论,这种推论是不可能的。)至于“如果你了解你的实体是什么,以及它们的属性是什么 - 你基本上不是从已经在BCNF中的表开始的吗?” ,这确实取决于您的概念级实体已被“正确”识别(对于后一个词的某些含义 - 我所指的是,就像人们可以提出糟糕的数据库设计,他们也可以来糟糕的概念模型,如果你使用这么糟糕的模型来建立你的数据库设计,你可以猜出出来的结果。
答案 2 :(得分:0)
reannb讨论了可以提供有关FD的信息的各种工件:领域专业知识,UI设计,FK约束,源代码,查询,与其他开发人员交谈。换句话说,你或者只是知道FD(领域专家,其他开发者),或者你正在寻找那些人的知识蒸馏(UI,FK,代码)。但领域专家从哪里获得FD?如果它不是E / R模型 - 无论是明确的还是内部的,直观的 - 那么FD的来源是什么?
Erwin Smout说,基本上,GIGO,这显然是正确的。但是,如果不是E / R模型,那仍然没有说明FD的来源。所以我仍然不明白:FDs来自哪里,如果不是E / R模型?让我澄清一下:我并不是说规范化理论毫无用处,我同意Erwin Smout关于这个问题的观点。另外,我不是因为我是新手,(请参阅我的原帖)。我的问题与模式设计的教学有关。关于规范化理论的讨论似乎非常人为。他们从一个设计非常糟糕的架构开始,而且功能依赖性来自......好吧,他们从不说FD来自何处。应用规则瞧,我们有一个BCNF模式。在我看来,更合理,更现实,更有用的方法是:
架构设计以E / R模式开始。
以下是从E / R模型生成一组表格和FK定义的过程。
现在请注意,您的E / R模型实际上暗示了这些功能依赖性。
然后进入规范化理论并展示BCNF分解(例如)如何从相当糟糕的起点产生相同的模式。
如果继承了错误的架构,开发清晰的E / R模型和功能依赖关系可以帮助您找到一个好的架构。
答案 3 :(得分:0)
“您实际上使用依赖理论和范式吗?还是像我一样使用它?”
我设计数据库架构已有15年以上。
但是,我从未使用过依赖性理论(功能依赖性分析-FDA)
我也不用“动它”。
但是,我所有的架构设计都是第五范式。 (5NF)
我的秘密是我使用一种称为“对象角色建模”的形式化方法 我使用一个称为NORMA的免费工具来设计正式模型,NORMA工具可以从该模型中自动生成5NF逻辑模型。
在建模过程中,我打开了一个“关系视图”窗口,该窗口会自动并立即在其“当前状态”下生成我的角色模型的5NF逻辑视图。
当我对设计感到满意时,我选择了目标RDBMS(例如SQL Server),然后单击了几下鼠标,便有了SQL DDL,然后将其剪切并粘贴到SQL Server Management Studio的“新建查询”面板中。 这种方法远比FDA或对其有效。
您可以download the free NORMA tool from here。 tutorials are here。
顺便说一句-我最近听说一所大学,该大学放弃了实体关系建模,而倾向于教授对象角色建模。
告白:我确实在几门大学课程中都使用FDA作为学生,但这足以让我终身受益!