【发布时间】:2018-08-02 21:38:58
【问题描述】:
我拥有多年的软件工程师经验,并且广泛使用过数据库,主要是 Oracle 和 Postgres。我为数据库模式使用了一种可能被称为非正式设计方法的方法。我画出类似 E/R 图的草图,然后从那里生成 DDL。随着时间的推移,随着更多需求的到来,我会从那里修改架构。 我在计算机科学的学术方面接受过严格的培训,并撰写了与数据库相关的硕士和博士论文。我了解依赖关系、范式和分解方法。而且我发现这种模式设计方法在现实世界中完全没用。
我现在正在教授一门关于数据库系统的高级课程,并且尽职尽责地学习了有关模式设计的经典材料,包括依赖项、范式、分解。但我仍然不相信这种方法的实际价值。
这些理论主题的教科书讨论,从设计非常糟糕的模式开始,以及来自......的函数依赖关系,我不知道。它们就在那里,然后它们会引导您找到更好的模式。但是从一个好的实体/关系模型开始,你可能会从一个非常好的模式开始。如果您了解您的实体是什么,以及它们的属性是什么——您基本上不是从 BCNF 中已有的表开始的吗?
对于那些设计和维护模式的人,你真的使用依赖理论和范式吗?还是你像我一样随心所欲?
【问题讨论】:
-
我在设计表或查询时会考虑功能依赖关系。当我加入表时,我需要知道哪些列确定/识别输出,以了解我是否需要执行 GROUP BY。这需要使用 Armstrong 公理来理解 FD 和心理代数。我知道人们成功地实现了这一目标,但我不想再那样工作了。
-
我对设计表格特别感兴趣。你如何获得FD?您如何获得从分解中受益的初始表定义?
-
当我规划一个功能时,我经常会想“要做到这一点,我们需要一个从 X 到 Y 的 FD”。例如。在设计 UI 屏幕或报告时,如果要求为每个 X 显示一个 Y,则需要一个相应的 FD(可能是可传递的)。如果 FD 不存在并且无法添加,则需要调整屏幕或报告以处理每个 X 的多个 Y。至于分解,在广告中构建或改编的旧表格源源不断- 特设时尚。在修复不一致的数据时,我也经常使用这些技术。
-
“我发现这种模式设计方法在现实世界中完全没用。” 为什么?不准确吗?是不确定的吗?不明白函数依赖从何而来?
-
您最好在Database Administrators 提问。 (或Computer Science。)虽然我觉得这很奇怪——你的实际兴趣似乎是“这种方法是否有“实际价值”?规范化在教科书中的表现不佳,在教科书之外表现得非常糟糕,因此实际上总是学得不好或被误解,或者只是没有学过,那么“你会使用什么”呢? (我一直想发表一个答案——大意是即使是最好的演示文稿也是一团糟,但规范化至关重要且 ER 建模不足——但理由使它有点像一篇文章。)
标签: database-design relational-database database-schema database-normalization functional-dependencies