【问题标题】:Database schema normalization checker?数据库模式规范化检查器?
【发布时间】:2018-02-24 21:56:17
【问题描述】:

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

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

基本上是一个用于数据库架构设计的静态分析工具。

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

【问题讨论】:

    标签: database database-normalization genexus


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      像您描述的工具,它试图分析您的数据和元数据并就可能非规范化结构向您提供建议,它会频繁地给出错误建议,以至于它会让微软助手 Clippy 看起来像是一个不可或缺的作家助手。

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

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

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

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

      【讨论】:

      • 我发现这篇论文引用了一篇论文:actapress.com/PaperInfo.aspx?PaperID=28880&reason=500 这表明至少有人认为可以在这个领域创造一些有用的东西:) 这是一篇研究论文,所以不知道该解决方案的实用性如何。
      • wrt phone numbers,一个工具可以检测具有多个电话号码列的表,或者通过检测字符串“phonenumber”在列名中重复,或者通过检测数据的格式、长度相同等。
      • 任何此类工具或技术都会有很高的“误报率”。让人类来完成设计工作会更准确、更可靠、更经济。
      【解决方案3】:

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

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

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

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

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

      【讨论】:

      • 大约 20 年前,我将 Bernstein 论文中描述的过程作为本科项目实施。程序的输入是您的数据库的一组功能依赖关系 (FD)。输出是一个规范化的模式。这种方法的问题在于,那些了解 FD 的人可以轻松开发规范化模式,而那些不了解 FD 的人无论如何都无法将程序的输入放在一起!不幸的是,我剩下的唯一副本在一张 5.25 英寸的软盘上——而且无法读取。
      【解决方案4】:

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

      http://schemaspy.sourceforge.net/

      【讨论】:

        【解决方案5】:

        我认为这很难实现。

        比如一张桌子

        Id | Name | Surname | SSN 
        

        在 1NF 中,并且

        Id | Name | Surname | Mobile
        

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

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

        【讨论】:

        • 你的两个例子都在 1NF 中。你是说2NF吗?
        • 这不仅很难,而且在计算上可能是不可能的。但是您可以对确定任何非 NULL LMP 条目很可能与“女性”GENDER 条目相关的扫描进行成像(某些数据输入错误可能会意外选中“男性”框)。在这里思考启发式...
        • @finnw:一个人可以拥有多个手机号码。这是 Wikipedia 上的经典示例 :)
        • @Quassnoi,这违反了 2NF,因为 (Id, Mobile) 是唯一的候选键,但 Name 和 Surname 仅取决于 Id。它仍然是 1NF,直到您将 Mobile 设为逗号分隔的字符串,但它可能会被称为 Mobiles(复数)
        【解决方案6】:

        做不到。

        规范化是根据函数依赖定义的

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

        你可以看一个表格,比如

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

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

        【讨论】:

        • 请记住,我并不是在寻找任何完全正确的工具,事实上,我已经限定了我的问题以排除这种可能性。也许该工具也可以考虑对此类功能依赖项进行编码。
        • 但是,如果您有一个包含 100 万行的表,其中 B 为 2,而 99.9999% 的行中 A 为 1(可能存在错误,所有 B 值都应为 2),并且对于 A 的任何其他值,B 永远不会为 2,您可能希望有一个工具指出这一点,以便您考虑它。
        猜你喜欢
        • 2014-08-10
        • 1970-01-01
        • 2012-03-06
        • 1970-01-01
        • 2017-09-20
        • 2018-03-24
        • 1970-01-01
        • 2014-07-15
        • 2013-09-27
        相关资源
        最近更新 更多