sql - 从 Postgresql 表中绘制表和关系

标签 sql database r plot schema

是否可以使用 R 绘制 postgresql 数据库中的表及其关系,如下所示?

enter image description here

最佳答案

对的,这是可能的。

至于怎么可能,请看下面的步骤

步骤

  • 连接 PostgreSQL 数据库
  • 获取数据库的架构信息
  • 在数据结构中存储模式信息/将数据帧中的数据重新排列为数据结构。
  • 从数据结构生成图

  • 步骤 1

    对于从 R 连接到 PostgreSQL 数据库,有多种机制可以这样做,包括
  • 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
  • PostgreSQL to list foreign keys (您只需从 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 RApply 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, "select table_name,constraint_name, constraint_type from information_schema.table_constraints")
    

    步骤 3

    从第 2 步开始,您应该有表格列表、表格列表及其相关字段/列,以及表格列表及其相关约束。

    您需要为 CityPlot 输出 csv 文件以供使用,或为 GraphViz 输出点文件,或 igraph 的图形格式或数据框或 hash为了使用绘制表格的函数进行处理,并使用网格或图表绘制它们之间的连接。

    如果您将它们组合成单个数据帧,子集和合并将很有用。

    第 4 步

    这一步也可以通过许多不同的方式来完成。这些包括但不限于
  • grid-package (有关与您请求的用例匹配的示例文章,请参阅引用文献中的 pdf),低级图形原语
  • diagram packageshape 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
  • 关于sql - 从 Postgresql 表中绘制表和关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19446393/

    相关文章:

    mysql - 连接语句 MySQL 中的项目总和

    SQL查询球员平均热连胜持续时间

    java - 如何使用 wamp 服务器发送 Spinner 在数据库中选择的值

    java - Spring Boot 中的 ManyToMany 映射问题

    r - 无法调整ggplot中的次 Axis 比例

    r - 从计算的角度来看,有没有办法简化 $ADA^T$,其中 $D$ 是对角矩阵?

    mysql - 列中的唯一值,但仅对于每个关联的外键是唯一的 : MySQL

    java - 用于 Java 的日志解析器

    SQL 表性能 - 大表

    r - 更新 R 数据框中的值