IT-инфраструктура для бизнеса и творчества
Разработка
NTA

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

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

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

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

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

{ "author_name": "NTA", "author_type": "editor", "tags": ["\u0441\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c","\u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u0439","\u0440\u0430\u0437\u043d\u043e\u0441\u0438\u043c","\u043e\u0442\u0440\u0438\u0441\u043e\u0432\u043a\u0430","\u043e\u0431\u044a\u0435\u0434\u0438\u043d\u044f\u0435\u043c","\u043c\u043e\u0436\u043d\u043e","\u0434\u043b\u044f"], "comments": 0, "likes": 5, "favorites": 11, "is_advertisement": false, "subsite_label": "dev", "id": 179879, "is_wide": true, "is_ugc": false, "date": "Mon, 23 Nov 2020 12:28:02 +0300", "is_special": false }
(function () { let cdnUrl = `https://specialsf378ef5-a.akamaihd.net/SelectelBranding/images/` let previousArticleNumber = null let currentArticleNumber = 0 let platform = 'Desktop' let articles = [ // { // name: 'camera', // url: `${cdnUrl}CameraCat`, // text: 'умную камеру для\u00A0наблюдения за\u00A0котиками', // link: '1', // }, { name: 'chill', url: `${cdnUrl}ChillCat`, text: 'трекер, который подскажет, когда пора отдохнуть', link: 'https://vc.ru/promo/288561-eye-tracker', }, // { // name: 'cloud', // url: `${cdnUrl}CloudCat`, // text: 'котика: даёшь ему «пять», а\u00A0он делает бэкап в облако', // link: '3', // } ] let buttonCycle = document.querySelector('.button--cycle') let textField = document.querySelector('.selectel-footer-subtitle') let imageAgent = document.querySelector('.image--agent') let banner = document.querySelector('.selectel-footer') buttonCycle.addEventListener('click', cycleClick) let media = window.matchMedia("(max-width: 570px)") media.addEventListener('change', matchMedia) function matchMedia() { if (media.matches) { platform = 'Mobile' } else { platform = 'Desktop' } update() } matchMedia() function cycleClick(event) { if (event) { event.preventDefault() event.stopPropagation() } window.open('https://vc.ru/tag/selectelDIY', '_blank') //cycle(event) } function cycle(event) { // incrementArticleNumber() textField.innerHTML = generatedText() imageAgent.src = articles[currentArticleNumber].url + platform + '.svg?5' imageAgent.setAttribute("class", "") imageAgent.classList.add('image--agent', articles[currentArticleNumber].name) banner.href = articles[currentArticleNumber].link } function update() { banner.href = articles[currentArticleNumber].link imageAgent.src = articles[currentArticleNumber].url + platform + '.svg?5' textField.innerHTML = generatedText() } function incrementArticleNumber() { previousArticleNumber = currentArticleNumber if (currentArticleNumber >= articles.length - 1) { currentArticleNumber = 0 } else { currentArticleNumber++ } } function generatedText() { let defaultText if (platform === 'Desktop') { defaultText = `Мы тут собрали %text%. Хотите почитать?` } else { defaultText = `Мы тут собрали %text%.` } return defaultText.replace('%text%', articles[currentArticleNumber].text) } function getRandom(min, max) { min = Math.ceil(min) max = Math.floor(max) return Math.floor(Math.random() * (max - min + 1)) + min } (function create() { currentArticleNumber = getRandom(0, articles.length - 1) cycle() let page = document.querySelector('.page--entry') if (page) { function insertAfter() { let parents = page.querySelectorAll('[data-id="7"]') let referenceNode = parents[0] referenceNode.parentNode.insertBefore(banner, referenceNode.nextSibling); loaded() } setTimeout(() => insertAfter(), 0) } }()) function loaded() { banner.classList.add('loaded') } loadImages([ `${cdnUrl}CameraCatDesktop.svg`, `${cdnUrl}ChillCatDesktop.svg`, `${cdnUrl}CloudCatDesktop.svg`, `${cdnUrl}CameraCatMobile.svg`, `${cdnUrl}ChillCatMobile.svg`, `${cdnUrl}CloudCatMobile.svg`, ]) function loadImages(urls) { return Promise.all(urls.map(function (url) { return new Promise(function (resolve) { var img = document.createElement('img'); img.onload = resolve; img.onerror = resolve; img.src = url; }); })); } }())
0
0 комментариев
Популярные
По порядку
Читать все 0 комментариев
Что за чудеса происходят с алгоритмами Яндекс.Директ в РСЯ. Почему испортилась РСЯ и как это исправить

Многие рекламодатели Яндекс.Директ начиная с лета 2021-го года заметили странные тенденции в работе нейросети РСЯ. Я в их числе. Что делать, если рекламные кампании резко перестали приносить конверсии и засоряют сайт некачественным трафиком за ваши деньги? Попробуем разобраться и изучить вопрос на конкретных примерах мусорного трафика.

Заголовок вышел из-под контроля
Как традиционному малому бизнесу превратиться в стартап: план действий

Сейчас в России предприниматели переходят из традиционного малого бизнеса в стартапы очень редко — меньше чем в 0,02% случаев. Это не больше 1 000 стартапов из около 6 млн предприятий малого бизнеса. Поговорим о том, что мешает предпринимателям и как действовать, если есть желание создать стартап.

Чудаки на букву М, МТС продал оплаченный Iphone 13 pro max

Собственно возжелала душа новинку, новый IPhone 13 pro max. Начал искать в гугле и нашел на офф.сайте МТС нужную модель в наличии, под самовывоз с салона, заказал и сразу оплатил.

Как мы проводили командную ретроспективу в Minecraft

Рассказываем историю, на что стоит обратить внимание при проведении командного мероприятия в игре Minecraft, какие грабли могут быть, как организовать онлайн- и офлайн-участие.

Я задолбался искать нормальную девушку и создал Lovely Bot

Как Tinder, только знакомит на основе взаимных увлечений

Почему стартапы терпят поражение

Ключевые идеи не изданной на русском книги «Why Startups Fail» Тома Айзенманна, профессора делового администрирования в Гарвардской школе бизнеса.

Изображение предоставлено командой сервиса MakeRight.ru
Нужны ли в России сити-фермы

И появятся ли грядки на крышах пятиэтажек.

re-thinkingthefuture.com
Эксперты Httpool выступят на конференции по глобальному маркетингу Globalize! 2021

Событие соберет самых продвинутых специалистов в сфере трафика и аналитики из Google, Httpool, AppsFlyer, Aitarget, Angle Connect, TikTok, OWOX, SHAREit, Tribuna, SportQuake, LCFC, FBS.

Сервис аренды электросамокатов Whoosh добавил электровелосипеды — пока в тестовом режиме Статьи редакции

От 6 рублей за минуту.

За 100 лет до МММ: как рязанский банкир построил финансовую пирамиду в 19 веке и обманул вкладчиков на 12 млн рублей Статьи редакции

Когда в скопинском банке оказалось недостаточно денег, чтобы выплачивать проценты по вкладам, директор Иван Рыков «нарисовал» баланс и привлёк новых вкладчиков. На их деньги он отдавал проценты — так и зародилась первая в России финансовая пирамида, которая просуществовала 15 лет.

Здание Скопинского банка Архив Скопинского исторического общества
null