diff --git a/Latex/Chapter3.tex b/Latex/Chapter3.tex index 407835c..848df51 100644 --- a/Latex/Chapter3.tex +++ b/Latex/Chapter3.tex @@ -10,12 +10,11 @@ Табличная форма удобна тем, что позволяет явно фиксировать элементы сети и их атрибуты, редактировать отдельные значения и проверять заполненность полей. При этом она допускает частично заданные конфигурации: часть параметров может быть указана сразу, а часть оставлена пустой для последующего уточнения. -При разработке табличного представления конфигурации сети виртуальных машин рассматривались два варианта организации данных: представление в первой нормальной форме и представление в третьей нормальной форме. Оба варианта позволяют формализовать описание сети, однако различаются удобством редактирования данных. - -В первой нормальной форме данные представляются в виде одной или нескольких таблиц, где каждая строка содержит атомарные значения: имя узла, интерфейс, адреса, принадлежность сети и т.д.. Такое представление остаётся достаточно простым для ручного заполнения и позволяет сразу видеть основную структуру конфигурации. +При разработке табличного представления конфигурации сети виртуальных машин рассматривались два варианта организации данных: представление в первой нормальной форме и представление в третьей нормальной форме. Оба варианта позволяют формализовать описание сети, однако различаются удобством редактирования данных. Вторая нормальная форма отдельно не рассматривалась как самостоятельный вариант представления, поскольку для данной задачи она является промежуточным этапом между компактным пользовательским описанием и полностью разнесённой структурой данных. Разберём оба представления на примере топологии, изображённой на рисунке~\ref{fig:exmpl1} + \begin{figure}[h] \centering \includegraphics[width=0.8\textwidth]{files/exmpl1.png} @@ -23,7 +22,16 @@ \label{fig:exmpl1} \end{figure} -Пример представления в 1НФ: +\subsubsection*{Первая нормальная форма} + +Первая нормальная форма (далее - 1НФ) \cite{DB}: + +Переменная отношения находится в \textbf{1НФ} тогда и только тогда, когда в любом допустимом значении этой переменной отношения каждый её кортеж содержит только одно значение для каждого из атрибутов. + +В первой нормальной форме данные представляются в виде одной таблицы, где каждая строка содержит атомарные значения: имя узла, интерфейс, адреса, принадлежность сети и т.д.. Такое представление остаётся достаточно простым для ручного заполнения и позволяет сразу видеть основную структуру конфигурации. + + +Пример представления в 1НФ (таблица \ref{tab:1nf}): \begin{table}[h!] \centering @@ -44,11 +52,29 @@ com\_right & Switch & eth3 & C & \\ \hline \end{tabular} \caption{Network device configuration} +\label{tab:1nf} \end{table} +\subsubsection*{Третья нормальная форма} + +Третья нормальная форма (далее - 3НФ) \cite{DB}: + +Переменная отношения находится в \textbf{3НФ} тогда и только тогда, когда её неключевые атрибуты, если они существуют, являются одновременно: + +\begin{enumerate} + \item взаимно независимыми; + \item неприводимо зависимыми от первичного ключа. +\end{enumerate} + +\begin{itemize} + \item \textbf{Неключевой атрибут} --- это атрибут, который не входит в состав первичного ключа рассматриваемой переменной отношения. + + \item \textbf{Взаимно независимые атрибуты} --- это два или больше атрибутов, таких что ни один из них функционально не зависит от какой-либо комбинации остальных атрибутов. Подобная независимость подразумевает, что каждый такой атрибут может обновляться независимо от остальных атрибутов. +\end{itemize} + В третьей нормальной форме данные разделяются на отдельные сущности: узлы, интерфейсы, сетевые сегменты и связи. Такой подход уменьшает дублирование данных и лучше соответствует классической реляционной модели, однако делает представление более громоздким. Для понимания одной связи приходится обращаться сразу к нескольким таблицам. -Пример представления в 3НФ: +Пример представления в 3НФ (таблицы \ref{tab:3nf1} - \ref{tab:3nf3}): \begin{table}[h] \centering @@ -65,6 +91,7 @@ com\_right & Switch & eth3 & C & \\ \hline \end{tabular} \caption{Devices} +\label{tab:3nf1} \end{table} \begin{table}[h] @@ -86,6 +113,7 @@ com\_right & eth3 & C \\ \hline \end{tabular} \caption{Interfaces} +\label{tab:3nf2} \end{table} \begin{table}[h] @@ -101,21 +129,29 @@ PC4.eth1 & 10.0.0.4/24 \\ \hline \end{tabular} \caption{IPs} +\label{tab:3nf3} \end{table} +\subsubsection*{Выбор формы} + В качестве основного пользовательского представления была выбрана первая нормальная форма. Она удобнее для ручного заполнения, проще воспринимается при описании лабораторных стендов и не требует постоянного перехода между большим количеством связанных таблиц. Табличное представление в 1НФ используется как удобная форма ввода, а при дальнейшей обработке данные могут преобразовываться во внутреннюю модель, где отдельно выделяются узлы, интерфейсы и связи. Такой подход сохраняет простоту заполнения таблицы и одновременно позволяет использовать данные для экспорта в YAML или построения диаграммы топологии. \subsection{Внутренняя модель данных} -Табличное представление удобно для ввода, но для дальнейшей обработки требуется программная структура, в которой связи между объектами выражены явно. Поэтому данные таблиц должны преобразовываться во внутреннее представление, например в набор классов Python, соответствующих основным сущностям конфигурации. Такая модель служит центральным представлением, из которого могут формироваться другие виды результата. +Табличное представление удобно для ввода, но для дальнейшей обработки требуется программная структура, в которой связи между объектами выражены явно. Поэтому данные таблиц должны преобразовываться во внутреннее представление, например в набор классов Python (рисуок \ref{fig:uml_model1}), соответствующих основным сущностям конфигурации. Такая модель служит центральным представлением, из которого могут формироваться другие виды результата. -\todo[inline]{хоть и акцент обычно на табличках, это не совсем центральное. Представить пример uml для python классов} +\begin{figure}[h] +\centering +\includegraphics[width=0.8\textwidth]{files/UML.png} +\caption{UML диаграмма классов Python} +\label{fig:uml_model1} +\end{figure} \subsection{Преобразование модели данных} -Также одной из подзадач является разработка механизмов преобразования модели. Основными преобразованиями являются импорт данных из табличного описания во внутреннюю модель, экспорт в формализованный файл конфигурации и построение диаграммы топологии. YAML-файл в этом случае используется как структурированное описание, пригодное для дальнейшей обработки программами, вроде Netloom для поднятия сеьи из виртуальных машин, а D2 может применяться для генерации визуального представления сети на основе уже построенной модели. +Также одной из подзадач является разработка механизмов преобразования модели. Основными преобразованиями являются импорт данных из табличного описания во внутреннюю модель , экспорт в формализованный файл конфигурации и построение диаграммы топологии. YAML-файл в этом случае используется как структурированное описание, пригодное для дальнейшей обработки программами, вроде Netloom для поднятия сети из виртуальных машин, а D2 может применяться для генерации визуального представления сети на основе уже построенной модели. \subsection{Вывод} diff --git a/Latex/Chapter5.tex b/Latex/Chapter5.tex index c997771..4cf8f81 100644 --- a/Latex/Chapter5.tex +++ b/Latex/Chapter5.tex @@ -2,4 +2,3 @@ \label{sec:Chapter5} \index{Chapter5} \todo[inline]{Здесь надо перечислить все результаты, полученные в ходе работы. Из текста должно быть понятно, в какой мере решена поставленная задача.} -вот реф \cite{GLPK} реф diff --git a/Latex/files/UML.d2 b/Latex/files/UML.d2 new file mode 100644 index 0000000..d5c6bdd --- /dev/null +++ b/Latex/files/UML.d2 @@ -0,0 +1,93 @@ +direction: down + +Interface: { + shape: class + + name: str + itype: "[str]" + adapter: "[str]" + slave_interfaces: "[List[str]]" + parent_interface: "[str]" + ip_address: "[str]" + network: "[str]" + subnet_mask: "[str]" + default_gateway: "[str]" + vlan: "[str]" + device: Device +} + +Device: { + shape: class + + name: str + role: str + interfaces: "Dict[str, Interface]" +} + +Host: { + shape: class + + role: str +} + +Router: { + shape: class + + role: str +} + +Switch: { + shape: class + + role: str +} + +Network: { + shape: class + + name: str + interfaces: "List[Interface]" + network_ip: "[str]" +} + +Topology: { + shape: class + + devices: "Dict[str, Device]" + networks: "Dict[str, Network]" +} + +Host -> Device: { + target-arrowhead.shape: triangle + target-arrowhead.style.filled: false +} + +Router -> Device: { + target-arrowhead.shape: triangle + target-arrowhead.style.filled: false +} + +Switch -> Device: { + target-arrowhead.shape: triangle + target-arrowhead.style.filled: false +} + +Device -- Interface: interfaces { + source-arrowhead: 1..* + target-arrowhead: 1 +} + +Network -- Interface: interfaces { + source-arrowhead: 1..* + target-arrowhead: 1 +} + +Topology -- Device: devices { + source-arrowhead: 1..* + target-arrowhead: 1 +} + +Topology -- Network: networks { + source-arrowhead: 1..* + target-arrowhead: 1 +} diff --git a/Latex/files/UML.png b/Latex/files/UML.png index bf068f4..cb0285f 100644 Binary files a/Latex/files/UML.png and b/Latex/files/UML.png differ diff --git a/Latex/files/UML.svg b/Latex/files/UML.svg index 6979430..d6b0c40 100644 --- a/Latex/files/UML.svg +++ b/Latex/files/UML.svg @@ -1,17 +1,17 @@ -Interface+namestr+itype[str]+adapter[str]+slave_interfaces[List[str]]+parent_interface[str]+ip_address[str]+network[str]+subnet_mask[str]+default_gateway[str]+vlan[str]+deviceDevice+__init__(name, ...)void+__repr__(): strvoidDevice+namestr+rolestr+interfacesDict[str, Interface]+__init__(name: str)void+add_interface(interface: Interface)void+rm_interface(interface: Interface)void+__repr__(): strvoidHost+rolestrRouter+rolestrSwitch+rolestrNetwork+namestr+interfacesList[Interface]+network_ip[str]+__init__(name: str, [vlan: [str]], [network_ip: [str]])void+add_interface(interface: Interface)void+rm_interface(interface: Interface)void+__repr__(): strvoidTopology+devicesDict[str, Device]+networksDict[str, Network]+__init__()void+add_device(device: Device)void+rm_device(device: Device)void+add_network(network: Network)void+rm_network(network: Network)void+__repr__(): strvoid interfaces1..*1interfaces1..*1devices1..*1networks1..*1 - - - - - + .d2-3203124535 .fill-N1{fill:#0A0F25;} + .d2-3203124535 .fill-N2{fill:#676C7E;} + .d2-3203124535 .fill-N3{fill:#9499AB;} + .d2-3203124535 .fill-N4{fill:#CFD2DD;} + .d2-3203124535 .fill-N5{fill:#DEE1EB;} + .d2-3203124535 .fill-N6{fill:#EEF1F8;} + .d2-3203124535 .fill-N7{fill:#FFFFFF;} + .d2-3203124535 .fill-B1{fill:#0D32B2;} + .d2-3203124535 .fill-B2{fill:#0D32B2;} + .d2-3203124535 .fill-B3{fill:#E3E9FD;} + .d2-3203124535 .fill-B4{fill:#E3E9FD;} + .d2-3203124535 .fill-B5{fill:#EDF0FD;} + .d2-3203124535 .fill-B6{fill:#F7F8FE;} + .d2-3203124535 .fill-AA2{fill:#4A6FF3;} + .d2-3203124535 .fill-AA4{fill:#EDF0FD;} + .d2-3203124535 .fill-AA5{fill:#F7F8FE;} + .d2-3203124535 .fill-AB4{fill:#EDF0FD;} + .d2-3203124535 .fill-AB5{fill:#F7F8FE;} + .d2-3203124535 .stroke-N1{stroke:#0A0F25;} + .d2-3203124535 .stroke-N2{stroke:#676C7E;} + .d2-3203124535 .stroke-N3{stroke:#9499AB;} + .d2-3203124535 .stroke-N4{stroke:#CFD2DD;} + .d2-3203124535 .stroke-N5{stroke:#DEE1EB;} + .d2-3203124535 .stroke-N6{stroke:#EEF1F8;} + .d2-3203124535 .stroke-N7{stroke:#FFFFFF;} + .d2-3203124535 .stroke-B1{stroke:#0D32B2;} + .d2-3203124535 .stroke-B2{stroke:#0D32B2;} + .d2-3203124535 .stroke-B3{stroke:#E3E9FD;} + .d2-3203124535 .stroke-B4{stroke:#E3E9FD;} + .d2-3203124535 .stroke-B5{stroke:#EDF0FD;} + .d2-3203124535 .stroke-B6{stroke:#F7F8FE;} + .d2-3203124535 .stroke-AA2{stroke:#4A6FF3;} + .d2-3203124535 .stroke-AA4{stroke:#EDF0FD;} + .d2-3203124535 .stroke-AA5{stroke:#F7F8FE;} + .d2-3203124535 .stroke-AB4{stroke:#EDF0FD;} + .d2-3203124535 .stroke-AB5{stroke:#F7F8FE;} + .d2-3203124535 .background-color-N1{background-color:#0A0F25;} + .d2-3203124535 .background-color-N2{background-color:#676C7E;} + .d2-3203124535 .background-color-N3{background-color:#9499AB;} + .d2-3203124535 .background-color-N4{background-color:#CFD2DD;} + .d2-3203124535 .background-color-N5{background-color:#DEE1EB;} + .d2-3203124535 .background-color-N6{background-color:#EEF1F8;} + .d2-3203124535 .background-color-N7{background-color:#FFFFFF;} + .d2-3203124535 .background-color-B1{background-color:#0D32B2;} + .d2-3203124535 .background-color-B2{background-color:#0D32B2;} + .d2-3203124535 .background-color-B3{background-color:#E3E9FD;} + .d2-3203124535 .background-color-B4{background-color:#E3E9FD;} + .d2-3203124535 .background-color-B5{background-color:#EDF0FD;} + .d2-3203124535 .background-color-B6{background-color:#F7F8FE;} + .d2-3203124535 .background-color-AA2{background-color:#4A6FF3;} + .d2-3203124535 .background-color-AA4{background-color:#EDF0FD;} + .d2-3203124535 .background-color-AA5{background-color:#F7F8FE;} + .d2-3203124535 .background-color-AB4{background-color:#EDF0FD;} + .d2-3203124535 .background-color-AB5{background-color:#F7F8FE;} + .d2-3203124535 .color-N1{color:#0A0F25;} + .d2-3203124535 .color-N2{color:#676C7E;} + .d2-3203124535 .color-N3{color:#9499AB;} + .d2-3203124535 .color-N4{color:#CFD2DD;} + .d2-3203124535 .color-N5{color:#DEE1EB;} + .d2-3203124535 .color-N6{color:#EEF1F8;} + .d2-3203124535 .color-N7{color:#FFFFFF;} + .d2-3203124535 .color-B1{color:#0D32B2;} + .d2-3203124535 .color-B2{color:#0D32B2;} + .d2-3203124535 .color-B3{color:#E3E9FD;} + .d2-3203124535 .color-B4{color:#E3E9FD;} + .d2-3203124535 .color-B5{color:#EDF0FD;} + .d2-3203124535 .color-B6{color:#F7F8FE;} + .d2-3203124535 .color-AA2{color:#4A6FF3;} + .d2-3203124535 .color-AA4{color:#EDF0FD;} + .d2-3203124535 .color-AA5{color:#F7F8FE;} + .d2-3203124535 .color-AB4{color:#EDF0FD;} + .d2-3203124535 .color-AB5{color:#F7F8FE;}.appendix text.text{fill:#0A0F25}.md{--color-fg-default:#0A0F25;--color-fg-muted:#676C7E;--color-fg-subtle:#9499AB;--color-canvas-default:#FFFFFF;--color-canvas-subtle:#EEF1F8;--color-border-default:#0D32B2;--color-border-muted:#0D32B2;--color-neutral-muted:#EEF1F8;--color-accent-fg:#0D32B2;--color-accent-emphasis:#0D32B2;--color-attention-subtle:#676C7E;--color-danger-fg:red;}.sketch-overlay-B1{fill:url(#streaks-darker-d2-3203124535);mix-blend-mode:lighten}.sketch-overlay-B2{fill:url(#streaks-darker-d2-3203124535);mix-blend-mode:lighten}.sketch-overlay-B3{fill:url(#streaks-bright-d2-3203124535);mix-blend-mode:darken}.sketch-overlay-B4{fill:url(#streaks-bright-d2-3203124535);mix-blend-mode:darken}.sketch-overlay-B5{fill:url(#streaks-bright-d2-3203124535);mix-blend-mode:darken}.sketch-overlay-B6{fill:url(#streaks-bright-d2-3203124535);mix-blend-mode:darken}.sketch-overlay-AA2{fill:url(#streaks-dark-d2-3203124535);mix-blend-mode:overlay}.sketch-overlay-AA4{fill:url(#streaks-bright-d2-3203124535);mix-blend-mode:darken}.sketch-overlay-AA5{fill:url(#streaks-bright-d2-3203124535);mix-blend-mode:darken}.sketch-overlay-AB4{fill:url(#streaks-bright-d2-3203124535);mix-blend-mode:darken}.sketch-overlay-AB5{fill:url(#streaks-bright-d2-3203124535);mix-blend-mode:darken}.sketch-overlay-N1{fill:url(#streaks-darker-d2-3203124535);mix-blend-mode:lighten}.sketch-overlay-N2{fill:url(#streaks-dark-d2-3203124535);mix-blend-mode:overlay}.sketch-overlay-N3{fill:url(#streaks-normal-d2-3203124535);mix-blend-mode:color-burn}.sketch-overlay-N4{fill:url(#streaks-normal-d2-3203124535);mix-blend-mode:color-burn}.sketch-overlay-N5{fill:url(#streaks-bright-d2-3203124535);mix-blend-mode:darken}.sketch-overlay-N6{fill:url(#streaks-bright-d2-3203124535);mix-blend-mode:darken}.sketch-overlay-N7{fill:url(#streaks-bright-d2-3203124535);mix-blend-mode:darken}.light-code{display: block}.dark-code{display: none}]]>Interface+namestr+itype[str]+adapter[str]+slave_interfaces[List[str]]+parent_interface[str]+ip_address[str]+network[str]+subnet_mask[str]+default_gateway[str]+vlan[str]+deviceDeviceDevice+namestr+rolestr+interfacesDict[str, Interface]Host+rolestrRouter+rolestrSwitch+rolestrNetwork+namestr+interfacesList[Interface]+network_ip[str]Topology+devicesDict[str, Device]+networksDict[str, Network] interfaces1..*1interfaces1..*1devices1..*1networks1..*1 + + + + + diff --git a/Latex/files/exmpl1.png b/Latex/files/exmpl1.png index 9e3f9f6..f6b78a7 100644 Binary files a/Latex/files/exmpl1.png and b/Latex/files/exmpl1.png differ diff --git a/notes.md b/notes.md index b82f0fb..68b61c0 100644 --- a/notes.md +++ b/notes.md @@ -10,12 +10,12 @@ набор полей в таблице -почему остальные нф нет +|почему остальные нф нет -сслыки на таблицы тоже -явное определение 3нф и 1нф -ввести сокращение -убрать рамку +/сслыки на таблицы тоже +/явное определение 3нф и 1нф +/ввести сокращение +|убрать рамку /сделать более полную таблицу