【问题标题】:Create database model using columns names (no FK, no relation)使用列名创建数据库模型(无 FK,无关系)
【发布时间】:2018-07-31 08:54:41
【问题描述】:

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

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

【问题讨论】:

  • 我不确定是否有自动工具,但如果列具有相同的名称并且这是关系的基础,您可以手动在系统视图中查找非唯一列名我想(例如 sys.columns 或 information_schema.columns),但显然您需要一些方法来解析误报(例如,简单地命名为“ID”且彼此不相关的列)。

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


【解决方案1】:

嗯,这是一项艰巨的任务(我自己也做过),但我可以想到一些提示来自动化你的工作,例如像 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 和动态 SQL 检查 count(distinct *) 是否等于 count(*) - 这会告诉你是否有唯一值,最后你会 count(*)where 子句中使用is not null 过滤器,这样您就会知道您是否在特定列中有nulls。

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

【讨论】:

    【解决方案2】:

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

    祝你好运。

    【讨论】:

      猜你喜欢
      • 2020-09-11
      • 2019-03-24
      • 2019-11-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-24
      • 1970-01-01
      • 2011-04-02
      相关资源
      最近更新 更多