Как построить схему данных для нескольких таблиц?

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

Как показывает опыт, часто мы имеем большое количество таблиц в базах данных и крайне редко у них есть схема, по которой мы можем получить наглядное представление о связях всех таблиц. Когда у тебя две-три таблички, то схема не требуется, ее и так можно легко представить в голове. Но когда таблиц уже больше 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()

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

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

0
Комментарии
-3 комментариев
Раскрывать всегда