9

我有兴趣了解像这样操作的工具:

给定一个数据库模式和一些数据,建议该模式是否可能以任何特定的规范形式结构化,然后说明如何分解该模式以产生进一步的规范化。

基本上,一个用于数据库模式设计的静态分析工具。

像其他静态分析工具一样,这样的数据库工具不需要产生完美的结果(我怀疑这样的“完美”工具在计算上是可行的),或者适用于所有数据库系统,或者免费/开源,或其他任何东西。该工具不必是独立的;它可以捆绑为一些复杂的 IDE 功能。我只是想知道外面有什么。

4

6 回答 6

6

像您描述的工具,它试图分析您的数据和元数据并建议您可能的非规范化结构,会经常给出错误的建议,这会使微软助手 Clippy 看起来像是一个不可或缺的作家助手。

在此处输入图像描述

规范化过程涉及将软件需求映射到逻辑数据模型。分析工具无法比您更好地了解您的数据需求。所以它不能从不正确的数据库设计中推断出它的哪些部分是错误的。

我了解您已对问题进行了限定,并且您对该工具的功能的期望有限。但是您会希望它对普通的日常任务有用——但即使对于最简单的情况,它也不可靠。

与静态代码分析工具相比。假设您编写了一个应用程序并将其交付给您的客户,而客户说“为什么我不能从这个应用程序发送电子邮件?” 静态代码分析工具如何告诉您您省略了所需的功能?它无法知道这些要求。

同样,数据库规范化分析工具如何知道该UserAccount表是否适合具有单个MobilePhoneNumber属性,或者是否更适合将电话号码分隔到另一个表中以便单个用户可以列出多个电话?

于 2009-02-12T20:18:47.537 回答
6

可以做到,并且至少有 2 种商用工具可以为您进行标准化:GeneXus 和 DeKlarit。他们使用一个名为NormalizationBySynthesis的过程

于 2010-02-25T06:37:15.837 回答
3

我也想过这个问题。这在理论上是可能的,并且有一些关于这个主题的研究论文。www.dbtools.cs.cornell.edu 曾经有一个很酷的工具。这是由著名作家 Raghu Ramakrishnan 开发的。他目前在雅虎研究部。您可以参考以下论文以获取更多信息

  1. 迪德里希,T. 和 Miton,J.,(1988),“数据库规范化的新方法和快速算法”,数据库系统上的 ACM 事务,13(3),339-365。
  2. Bernstein, PA(1986),“从函数依赖中综合第三范式关系”,ACM 数据库系统事务,第 1 卷。第 4 期,第 277-298 页。
  3. JMathNorm:使用 Mathematica 的数据库规范化工具,计算机科学讲义;卷。4488,第七届计算科学国际会议论文集,第二部分,阿里·亚兹奇,齐亚·卡拉卡亚

第三个链接非常有趣。以下是论文摘要:

本文是关于设计一个名为 JMathNorm 的完整交互式工具,用于使用 Mathematica 进行关系数据库 (RDB) 规范化。它是由同一作者 [1] 开发的原型的扩展,除了现有的第三范式 (3NF) 模块外,还包括第二范式 (2NF) 和 Boyce-Codd 范式 (BCNF)。本研究中开发的工具是完整的,可用于实时数据库设计,并有助于向数学背景有限的学生教授 DB 规范化的基本概念。JMathNorm 还支持交互使用模块来试验基本的集合操作,例如闭包、以及与模块一起完全闭合以获得功能依赖集的最小覆盖并测试候选键的属性。JMathNorm 的 GUI 界面是用 Java 编写的,并利用 Mathematica 的 JLink 工具来驱动 Mathematica 内核。

我也对这个问题的答案非常感兴趣。如果有人遇到过工具,请告诉我们!

于 2009-08-28T08:00:06.250 回答
2

开源工具 SchemaSpy 检测到一些“异常”,例如“没有索引的表”或“标记为‘可为空’和‘必须唯一’的列”。这些异常之一是“列名递增的表,可能表示非规范化”

http://schemaspy.sourceforge.net/

于 2012-06-08T12:59:43.800 回答
1

我认为这很难实现。

比如一张桌子

Id | Name | Surname | SSN 

处于 1NF 中,并且

Id | Name | Surname | Mobile

不是,但你既不能从设计上也不能从数据上说,只能从字段名上说。

我曾经见过一个超声检查数据库,它实际上在一个表中同时包含GENDERLMP(末次月经)。

于 2009-02-12T19:39:10.580 回答
0

这是不可能的。

规范化是根据功能依赖关系定义的

  1. 不能用SQL表达
  2. 无法从数据中推断

您可以查看一个表格,例如

A | B
--+--
1 | 1
1 | 2

并推断出 B依赖于 A(因为它对于 A 的单个值有两个不同的值),但是您永远不能推断出依赖关系确实存在,例如 A 可能依赖于 B,也可能不依赖于 B。

于 2009-02-12T19:33:30.500 回答