微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

foreign-keys – 用于在数据库中发现事实上的外键的工具?

快速调查数据库中信息的一种好方法是应用一个工具,自动创建所有表的数据库图表以及它们之间的所有关系.

根据我的经验,这些工具使用外键作为关系,我尝试它们的大多数数据库都不包含这些关系.当然,它们满足与外键相对应的约束,但不强制执行它们.而且我最终会得到一个由一堆不相关的表组成的“图表”.

所以我正在寻找的是可以计算“未声明的外键”的软件

>将它们用作数据库关系图中的表关系,或
>为相应的外键声明生成sql代码

你知道任何可以做到这一点的免费工具吗?

解决方法

有趣的问题.您正在寻找解析数据库模式和数据以确定哪些表相关或应该彼此相关,而没有任何严格的关系定义.实际上,你试图推断出一种关系.

我看到两种方法可以推断出这种关系.首先,请允许我说您的方法可能会因您使用的数据库而异.一些问题浮现在脑海中(我不想要答案,但值得反思)

>这些内部企业系统是否遵循一致的命名约定或模式?
>或者它们是否是您随时随地遇到的“野外”数据库
>你准备做什么样的假设?
>您希望在结果中获得更多误报或漏报吗?

请注意,这种类型的推断几乎肯定会给出错误的结果,并且建立在很多假设之上.

所以我提供两种方法,我将在演唱会中使用.

通过结构/命名(符号分析)推断关系

通用数据库设计是在表名之后命名PK列(例如,表Customer上的CustomerId),或者将PK列命名为Id.

与另一个表具有FK关系的表通常将其相关列命名为与相关表相同.在Order表中,我期望CustomerId列引用Customer表中的CustomerId / Id列.

这种分析包括

>检查表格中的列以查找类似的短语/单词
>查找与其他表的名称类似的列名
>检查包含其他列名称的列名称(例如,FirstCustomerId& SecondCustomerId都引用Customer表中的CustomerId列)

通过数据推断关系(统计分析)

正如您建议在评论中所做的那样,查看数据将允许您确定“可能的”参考.如果Order表中的CustomerId列包含Customer表的Id列中不存在的值,那么可以合理地质疑这是一个有效的关系(尽管你永远不知道!)

一种简单的数据分析形式是使用日期和时间.彼此非常接近而创建的行更可能彼此相关.如果,对于创建的每个Order行,在几秒钟内也存在2到5个Item行之间,那么两者之间可能存在关系.

更详细的分析可能会查看使用值的范围和分布.

例如,如果Order表具有St_Id列 – 您可能会推断使用符号分析该列可能与State表或Status表相关. St_Id列有6个离散值,90%的记录由2个值覆盖. State表有200行,Status表有9行.您可以非常合理地推断St_Id列与Status表相关 – 它为表的行提供了更大的覆盖率(2/3的行是’used’,而State表中只有3%的行会被使用).

如果您对现有数据库进行数据分析以收集“真实数据”,我希望可以使用一些模式作为结构推理的指南.当具有大量记录的表具有重复多次的少量值的列(不一定按顺序)时,该列更可能与具有相应少量行的表相关.

综上所述

祝你好运.这是一个感兴趣的问题,我刚刚提出了一些想法,但这是一个非常好的试验和错误,数据收集和性能调整情况.

原文地址:https://www.jb51.cc/mssql/78190.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐