至于如何实现,请参阅以下步骤
脚步
>连接到Postgresql数据库
>获取数据库的架构信息
>将架构信息存储在数据结构中/将数据帧中的数据重新排列为数据结构.
>从数据结构生成图表
步骤1
> RPostgreSQL(R到Postgresql,持久连接)
> sqldf(R到Postgresql,临时连接自动执行第3步的一部分),它有RPostgresql作为依赖.
> PL/R(Postgresql到R)
> db.r(R到Postgresql,具有内置的基本数据库可视化,例如部分步骤2,3,4,)
RPostgresql中的步骤1的示例如下:
library(RPostgresql) ## loads the Postgresql driver drv <- dbDriver("Postgresql") ## Open a connection con <- dbConnect(drv,dbname="databasename")
第2步
这可以通过几种方式完成.它可以直接在sql中完成,也可以使用
RPostgresql的dbListTables和dbListFields或两者的组合.
例如,sql用于查询数据库中的所有表,或表中的所有字段/列或表中的所有约束,请参阅以下StackOverflow答案
> PostgreSQL Describe Table
> Show tables in PostgreSQL
> List all tables in PostgreSQL information schema
> How do I list all columns for specified table DBA StackExchange
> @L_403_9@(您只需从where子句中删除或修改约束类型以获取外键和主键)
总之,您只需查询information_schema.tables,information_schema.columns和information_schema.table_constraints即可获得所需信息.如果速度是一个问题(在上面的链接答案中提到它们),您可以使用Postgresql特定表而不是ANSI sql标准表,但它们可能会随时间而变化.
这里的步骤是
>获取表格列表
>遍历表列表并获取每个表的列(或者只是查询包含结果集中表名和列名的查询的所有列)
>遍历表列表并交替获取每个表的约束,只查询包含结果集中表名和约束名的查询的所有列
RPostgresql中的步骤2的示例如下:
调整您的sql以适应.
第1部分
获取表格列表
使用内置功能
tables1 <- dbListTables(con)
使用sql
tables2 <- dbGetQuery(con,"select table_name from information_schema.tables")
第2部分
使用内置功能
您将使用dbListFields(con,“TableName”),并应用于表的先前数据帧.请参见how to apply a function to every row of a matrix (or a data frame) in R或Apply a function to each row in a data frame in R并将结果保存到变量.
使用sql
columns2 <- dbGetQuery(con,"select table_name,column_name from information_schema.columns")
第3部分
使用sql
constraints <- dbGetQuery(con,constraint_name,constraint_type from information_schema.table_constraints")
第3步
从第2步开始,您应该有表列表,表列表及其关联的字段/列,表列表及其相关约束.
您需要输出要使用的CityPlot的csv文件,或GraphViz的点文件,或者igraph的图形格式或数据框或hash,以便使用使用网格或图表绘制表格和连接的函数进行处理.
如果要将它们组合到单个数据帧中,则子集和合并将非常有用.
第4步
该步骤也可以以许多不同方式完成.这些包括但不限于
> grid-package(参见参考文献中的pdf,例如与您请求的用例匹配的文章),低级图形基元
> diagram package和shape package(参见参考资料中的pdf用法示例)略高级别的图形基元
> Rgraphviz package(Graphviz,基本上要么生成点文件步骤3,要么参阅参考文献中的pdf以获取更多信息)
> igraph package(仅为每列和表组合生成扁平圆圈)
> CityPlot package(生成实体关系图而不是数据库表图,但可能满足您的需求,需要步骤3从数据框生成csv文件)
如果使用图表,形状或网格包,您将迭代表列表,或散列或其他数据结构,并在每个表上应用绘图函数,然后有一个单独的函数,应用于每个约束绘制线条.
参考
> R an PostgreSQL using RPostgreSQL and sqldf
> Youtube video Example: PostgreSQL Connection to R
> Drawing Diagrams with R
> R Package diagram: visualising simple graphs,flowcharts,and webs
> Example RPostgreSQL usage
> Dot Guide For Graphviz
> How To Plot A Graph Using Rgraphviz