你如何记录数据库代码以查看数据库对象之间的依赖关系?

3
我想写一份关于我的宠物项目的文档。
我有30个表,近50个视图和约30个函数(存储过程)在我的PostgreSQL数据库中。
我想知道哪些表(哪些视图和哪些函数)被使用了。
我想知道哪些视图(哪些视图和哪些函数)被使用了。
我想知道一个函数是否被另一个函数使用。
我还想为每个对象(表、视图和函数)编写描述以及字段的简短描述。
简而言之,我希望能够看到特定对象的使用情况以及使用特定对象的对象。
我考虑使用一个文本文件来列出每个对象,并列出使用当前对象的对象以及被当前对象使用的对象。
<pre>
Table aaaa
A short description
used by : view v_aaaa

id  int     primary key
name  varchar(30)   name of a...

================================
view v_aaaa
A short description

list of fields...

used by function f_aaaa
Depends on  table aaaa



==============================

function f_aaaa
A short description
Parameters ( description, IN/OUT )
Depends on view v_aaaa
           function fbbbb 

==============================

function f_bbbb
A short description
Parameters
Called by function f_aaaa

我担心我的文档会很快失去同步

想象一下,我添加了一个调用f_aaaa和f_bbbb的函数f_cccc。我将不得不修改f_aaaa和f_bbbb的文档。

我知道UML描述实体之间的关系(它确实是这样吗?)。但我想要简单的东西,我不想参加75小时的培训...而且我不确定你是否可以像我想的那样在实体和函数之间建立“链接”。

你有什么建议吗?

我在Linux(Fedora)上使用PostgreSQL。如果您提供一个这样做的工具,它必须与PostgreSQL兼容:-)

对于我的代码文档,我使用Doxygen。

谢谢

5个回答

4

您可以通过查询数据库内部的“依赖”信息来收集其中一些信息。如果某个东西依赖于另一个东西,那就意味着它使用了它。以下是一个示例查询,以帮助您遍历涉及的两个结构:

SELECT
  c1.oid as relid,
  n1.nspname || '.' || c1.relname as relation,
  c1.relkind,
  c2.oid as relid,
  n2.nspname || '.' || c2.relname as dependency,
  c2.relkind
FROM 
  pg_depend d,
  pg_class c1,
  pg_namespace n1,
  pg_class c2,
  pg_namespace n2
WHERE 
  d.objid = c1.oid AND
  c1.relnamespace = n1.oid AND 
  n1.nspname NOT IN('information_schema', 'pg_catalog') AND
  n1.nspname !~ '^pg_toast' AND
  d.refobjid = c2.oid AND
  c2.relnamespace = n2.oid AND 
  n2.nspname NOT IN('information_schema', 'pg_catalog') AND
  n2.nspname !~ '^pg_toast' AND
  c1.oid != c2.oid
GROUP BY n1.nspname,c1.relname,c1.oid,c1.relkind,
  n2.nspname,c2.relname,c2.oid,c2.relkind
ORDER BY n1.nspname,c1.relname;

所有这些内部位的信息可以在系统目录文档中找到。(链接)


2
我不是为了查看依赖关系而编写文档。文档会自动过时。
我使用工具来完成这项工作。目前我使用ApexSQL的产品,但过去我曾使用Redgate的工具。

这对于一个宠物项目来说有点昂贵 :-) 没有适用于PostgreSQL的版本 :-( - Luc M

0

我在哪里可以看到 GetCar 是由 GetFastestCar 调用的? - Luc M
你可以创建一个名为CAR的类,在其中定义GetCar和GetFastesCar两个函数,并在每个函数中调用一个DB类来检索信息。当然,GetFastesCar也可以是GetCar的子类,但这时我们需要使用面向对象编程中的继承。如果你想要映射类之间的关系,那么你需要学习UML。 - Steven

0
考虑使用命名约定来加强 SQL 对象之间的依赖关系:
Table1
Table2
vw_table1_byField1
vw_table1_byField1_table2
vw_table2
fn_table1
fn_table1_table2

3
在我看来,这是一个真正糟糕的想法。函数名称必须表达其作用而不是函数所使用的东西。 - Luc M
是的,我也看到了。他在询问文档,你可以使用命名约定来说明它的功能和依赖关系。 - Beth

-1

我终于构建了一个巨大的HTML文件。

文件包含很多锚点,可以轻松导航到不同的对象。

这是一项艰巨的工作,但正是我想要的 :-)


1
手动构建在'09年肯定是一件痛苦的事情!从某种意义上讲,这就是javadoc、sphynx和其他文档工具所做的,除了它们解析代码并读取以特定格式定义的注释,并为您生成所有的HTML。很遗憾PostgreSQL没有类似的东西,但我想你可以在那些其他语言中完成它。我来到这里寻找这样的解决方案,但还没有看到。 - Davos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接