Время прочтения: 2 мин.

Как показывает опыт, часто мы имеем большое количество таблиц в базах данных и крайне редко у них есть схема, по которой мы можем получить наглядное представление о связях всех таблиц. Когда у тебя две-три таблички, то схема не требуется, ее итак можно легко представить в голове. Но когда таблиц уже больше 10 или у них множество связей между друг другом, то это довольно проблематично сделать.

Конечно, эту схему можно нарисовать в специальной программе, но на это тоже требуется немалое количество времени.

Есть более быстрый вариант для рисования схемы данных таблиц! Мы будем использовать python и Graphviz.

1 этап: Заносим в Excel-файл названия таблиц и связи между ними.

2 этап: Запускаем код на python:

from graphviz import Digraph
import pandas as pd
import random
#считываем файл
df = pd.read_excel("Связи.xlsx", dtype=str)
#разносим таблицы и столбцы в два dataframe
df1=df[["T1","S1"]]
df2=df[["T2","S2"]]
#для объединения переименуем столбцы
df2=df2.rename(columns={'T2':'T1','S2':'S1'})
#объединяем два dataframe в один и убираем дубликаты
df_concat=pd.concat([df1,df2])
df_concat=df_concat.drop_duplicates()
df_concat.sort_values(by='T1')
df_concat.reset_index(drop=True)
#для создания node
df_concat['T1_new']='['+df_concat['T1']+']'
df_concat['S1_new']='|<'+df_concat['S1']+'> '+df_concat['S1']
df_concat=df_concat.drop(['T1','S1'], axis=1)
df_concat['Count']=df_concat.groupby('T1_new').cumcount()
df_pivot=df_concat.pivot('T1_new', 'Count', 'S1_new')
df_p=pd.DataFrame(df_pivot.to_records())
df_p['concat']=pd.Series(df_p.fillna('').values.tolist()).str.join('')
df_node_label=df_p[['T1_new','concat']]
df_node_label['Res']=pd.Series(df_node_label.fillna('').values.tolist()).str.join('$$$')
#для связей
df['Res']='['+df['T1']+']'+':'+df['S1']+'$$$'+'['+df['T2']+']'+':'+df['S2']
ar1=df_node_label['Res'].values
ar2=df['Res'].values

#отрисовка
g=Digraph('structs',format='jpg')
g.attr(rankdir="LR")
g.attr('node', shape='record')
g.attr(size='100')

#рандомный цвет для ребер
def rcolor():
    r=random.randint(0,16777215)
    hexnumber=str(hex(r))
    hexnumber='#'+hexnumber[2:]
    return hexnumber

for i in ar1:
    node_ = i.split("$$$")[0]
    node_label = i.split("$$$")[1]
    g.node(node_,label=node_label)
    
for i in ar2:
    edge1 = i.split("$$$")[0]
    edge2 = i.split("$$$")[1]
    #можно менять параметр minlen для изменения расстояния между nodes
    g.edge(edge1,edge2, color=rcolor(), minlen='5')

g.view()

На выходе получаем готовую схему данных:

Вот так быстро можно нарисовать схему данных, если мы уже знаем связи между таблицами.