使用列名创建数据库模型(没有FK,没有关系)

时间:2018-02-20 21:41:20

标签: sql sql-server database-design database-schema

我有一个没有FK,PK的数据库,没有任何文档来显示哪些表相互关联。因此,我很难对物理数据进行逆向工程,以便了解一个表如何与另一个表相关。有没有人知道只根据列名创建模型的工具?

实施例: 表A有一个名称为ID_NTP_BAZINGA的列,该列与表B相关,列名为ID_NTP_BAZINGA。

2 个答案:

答案 0 :(得分:2)

嗯,这是一项艰巨的任务(我自己也做过),但我可以想到一些自动化工作的提示,例如sp_msforeachdbsp_msforeachtable之类的命令很方便。

要以您提到的方式确定FK关系,您可以使用此类查询:

select * from (
    select object_name(object_id) [table],
           name,
           count(*) over (partition by name) [cnt]
    from [DB_name].sys.columns
) a where cnt > 1

,在您的情况下,将返回(以及其他)

Table A | ID_NTP_BAZINGA
Table B | ID_NTP_BAZINGA

并给你一些见解。

对于PK的候选人,如果sp_msforeachtable等于count(distinct *),则可以使用count(*)进行动态SQL检查 - 这将告诉您是否具有唯一值,并且在count(*)子句中,您is not nullwhere过滤,因此您可以知道特定列中是否有null

这些是您必须自己编写的一些一般提示和确切查询。这个答案将帮助您入门。

答案 1 :(得分:0)

这是数据生物学。具有讽刺意味的是,首先开发数据库的原因之一是要保证数据比文件和记录具有更好的文档化记录。
在这种情况下,数据模型的最佳处理方法之一是应用程序代码。查看应用程序使用的sql,尤其是查询。检索是将数据转化为信息的时间,这就是您获得线索的地方。要特别注意ON和WHERE子句。您也许可以弄清楚列是用作PK和FK的,即使它们不是这样声明的。

祝你好运。