TikZ ER 圖 - 阻止跨單元格繪製關係

TikZ ER 圖 - 阻止跨單元格繪製關係

我已經調整了程式碼從這篇文章

我遇到的問題是表之間的關係(線)是跨越表而不是圍繞它們。

MWE 很長,但在這裡:

\documentclass[border=0.25in]{standalone}

\usepackage{tikz}
\usetikzlibrary{shapes.multipart}
\usetikzlibrary{matrix}
\usetikzlibrary{positioning}
\usetikzlibrary{shadows}
\usetikzlibrary{calc}

\makeatletter
\pgfarrowsdeclare{crow's foot}{crow's foot}
{
  \pgfarrowsleftextend{+-.5\pgflinewidth}%
  \pgfarrowsrightextend{+.5\pgflinewidth}%
}
{
  \pgfutil@tempdima=0.5pt%
  \advance\pgfutil@tempdima by.25\pgflinewidth%
  \pgfsetdash{}{+0pt}%
  \pgfsetmiterjoin%
  \pgfpathmoveto{\pgfqpoint{0pt}{-6\pgfutil@tempdima}}%
  \pgfpathlineto{\pgfqpoint{-6\pgfutil@tempdima}{0pt}}%
  \pgfpathlineto{\pgfqpoint{0pt}{6\pgfutil@tempdima}}%
  \pgfusepathqstroke%
}


\tikzset{
    entity/.code={
        \tikzset{
            label=above:#1,
            name=#1,
            inner sep=0pt,
            every entity/.try,
            fill=white,
            general shadow={
                shadow xshift=0.0625in,
                shadow yshift=-0.0625in,
                opacity=0.5,
                fill=black!50
            }
        }%
        \def\entityname{#1}%
    },
    entity anchor/.style={matrix anchor=#1.center},
    every entity/.style={
            draw,
    },
    every property/.style={
        inner xsep=0.25cm, inner ysep=0.125cm, anchor=west, text width=1.5in
    },
    zig zag to/.style={
        to path={(\tikztostart) -| ($(\tikztostart)!#1!(\tikztotarget)$) |- (\tikztotarget)}
    },
    zig zag to/.default=0.5,
    one to many/.style={
        -crow's foot, zig zag to
    },
    many to one/.style={
        crow's foot-, zig zag to
    },
    many to many/.style={
        crow's foot-crow's foot, zig zag to
    }
}
\def\property#1{\node[name=\entityname-#1, every property/.try]{#1};}
\def\properties{\begingroup\catcode`\_=11\relax\processproperties}
\def\processproperties#1{\endgroup%
    \def\propertycode{}%
    \foreach \p in {#1}{%
        \expandafter\expandafter\expandafter\gdef\expandafter\expandafter\expandafter\propertycode%
            \expandafter\expandafter\expandafter{\expandafter\propertycode\expandafter\property\expandafter{\p}\\}%
    }%
    \propertycode%
}

\begin{document}

\begin{tikzpicture}[every node/.style={font=\ttfamily}, node distance=1.25in]

\matrix [entity=Order Form, entity anchor=Order Form-Order ID -> PK]  {
    \properties{
        Order ID -> PK, 
        Cust ID -> FK,
        Order Date
    }
};

\matrix  [entity=Product Table, right=of Order Form-Order ID -> PK, entity anchor=Product Table-Vinyl ID -> PK]  {
    \properties{
        Vinyl ID -> PK,
        title,
        release year,
        record lbl,
        artist,
        album / single,
        cost price,
        Supplier ID -> FK,
        Retail Price,
        Reorder Lvl,
        Stock Lvl
    }
};

\matrix  [entity=Supplier Table, below=of Product Table, entity anchor=Supplier Table-Supplier ID -> PK]  {
    \properties{
        Supplier ID -> PK,
        Supplier Name,
        Sup Add 1,
        Sup Add 2,
        Sup Add 3      
    }
};

\matrix  [entity=Order Details, left=of Supplier Table, entity anchor=Order Details-Vinyl ID -> FK]  {
    \properties{
        Vinyl ID -> FK,
        Order ID -> FK,
        Quantity
    }
};


\matrix  [entity=Customer Table, below=of Supplier Table, entity anchor=Customer Table-Cust ID]  {
    \properties{
        Cust ID,
        First Name,
        Surname,
        Email,
        Postcode,
        Add. Line 1,
        Add. Line 2,
        Add. Line 3
    }
};

\draw [one to many] (Product Table-Vinyl ID -> PK) to (Order Details-Vinyl ID -> FK);
\draw [one to many] (Order Form-Order ID -> PK)   to (Order Details-Order ID -> FK);
\draw [one to many] (Customer Table-Cust ID) to (Order Form-Cust ID -> FK);
\draw [one to many] (Supplier Table-Supplier ID -> PK)  to (Product Table-Supplier ID -> FK);
\end{tikzpicture}

\end{document}

這是問題的圖像(可能會更立即清晰)-

在此輸入影像描述

我不知道如何阻止線條以目前的方式穿過盒子。我無法在其中找到可阻止此行為的變更值。

另一方面 - 這樣做似乎相當費力,如果其他人有任何關於替代方法的建議,我很高興聽到

謝謝

答案1

這是一種可能的解決方案。樣式zig zag to設定為預設值 0.5

zig zag to/.default=0.5

此外,one to many以下兩種樣式也會使用該預設值,這會導致錯誤。該提案刪除了樣式定義zig zag to中的one to many,因此不使用

\draw (<start>) to (<end>)

命令中的語法draw。而是使用那些常見的相對和正交座標繪圖技巧。

\draw (<start>) --++(x,0) |- (<end>);

因為內部標籤(<start>)(<end>)仍然有效,包含局部座標。

在此輸入影像描述

程式碼

\documentclass[border=0.25in]{standalone}

\usepackage{tikz}
\usetikzlibrary{shapes.multipart}
\usetikzlibrary{matrix}
\usetikzlibrary{positioning}
\usetikzlibrary{shadows}
\usetikzlibrary{calc}

\makeatletter
\pgfarrowsdeclare{crow's foot}{crow's foot}
{
  \pgfarrowsleftextend{+-.5\pgflinewidth}%
  \pgfarrowsrightextend{+.5\pgflinewidth}%
}
{
  \pgfutil@tempdima=0.5pt%
  \advance\pgfutil@tempdima by.25\pgflinewidth%
  \pgfsetdash{}{+0pt}%
  \pgfsetmiterjoin%
  \pgfpathmoveto{\pgfqpoint{0pt}{-6\pgfutil@tempdima}}%
  \pgfpathlineto{\pgfqpoint{-6\pgfutil@tempdima}{0pt}}%
  \pgfpathlineto{\pgfqpoint{0pt}{6\pgfutil@tempdima}}%
  \pgfusepathqstroke%
}
\makeatother

\tikzset{
    entity/.code={
        \tikzset{
            label=above:#1,
            name=#1,
            inner sep=0pt,
            every entity/.try,
            fill=white,
            general shadow={
                shadow xshift=0.0625in,
                shadow yshift=-0.0625in,
                opacity=0.5,
                fill=black!50
            }
        }%
        \def\entityname{#1}%
    },
    entity anchor/.style={matrix anchor=#1.center},
    every entity/.style={
            draw,
    },
    every property/.style={
        inner xsep=0.25cm, inner ysep=0.125cm, anchor=west, text width=1.5in
    },
    zig zag to/.style={
        to path={(\tikztostart) -| ($(\tikztostart)!#1!(\tikztotarget)$) |- (\tikztotarget)}
    },
    zig zag to/.default=0.5,
    one to many/.style={
        -crow's foot, % zig zag to  % disable this `zig zag to` command by mark it out
    },
    many to one/.style={
        crow's foot-, zig zag to
    },
    many to many/.style={
        crow's foot-crow's foot, zig zag to
    }
}
\def\property#1{\node[name=\entityname-#1, every property/.try]{#1};}
\def\properties{\begingroup\catcode`\_=11\relax\processproperties}
\def\processproperties#1{\endgroup%
    \def\propertycode{}%
    \foreach \p in {#1}{%
        \expandafter\expandafter\expandafter\gdef\expandafter\expandafter\expandafter\propertycode%
            \expandafter\expandafter\expandafter{\expandafter\propertycode\expandafter\property\expandafter{\p}\\}%
    }%
    \propertycode%
}

\begin{document}

\begin{tikzpicture}[every node/.style={font=\ttfamily}, node distance=1.25in]

\matrix [entity=Order Form, entity anchor=Order Form-Order ID -> PK]  {
    \properties{
        Order ID -> PK, 
        Cust ID -> FK,
        Order Date
    }
};

\matrix  [entity=Product Table, right=of Order Form-Order ID -> PK, entity anchor=Product Table-Vinyl ID -> PK]  {
    \properties{
        Vinyl ID -> PK,
        title,
        release year,
        record lbl,
        artist,
        album / single,
        cost price,
        Supplier ID -> FK,
        Retail Price,
        Reorder Lvl,
        Stock Lvl
    }
};

\matrix  [entity=Supplier Table, below=of Product Table, entity anchor=Supplier Table-Supplier ID -> PK]  {
    \properties{
        Supplier ID -> PK,
        Supplier Name,
        Sup Add 1,
        Sup Add 2,
        Sup Add 3      
    }
};

\matrix  [entity=Order Details, left=of Supplier Table, entity anchor=Order Details-Vinyl ID -> FK]  {
    \properties{
        Vinyl ID -> FK,
        Order ID -> FK,
        Quantity
    }
};


\matrix  [entity=Customer Table, below=of Supplier Table, entity anchor=Customer Table-Cust ID]  {
    \properties{
        Cust ID,
        First Name,
        Surname,
        Email,
        Postcode,
        Add. Line 1,
        Add. Line 2,
        Add. Line 3
    }
};

\draw [one to many] (Product Table-Vinyl ID -> PK) --++(-2.7,0) |-  (Order Details-Vinyl ID -> FK);
\draw [one to many] (Order Form-Order ID -> PK)   --++(-3,0) |- (Order Details-Order ID -> FK);
\draw [one to many] (Customer Table-Cust ID) --++(-2.7,0) |-(Order Form-Cust ID -> FK);
\draw [one to many] (Product Table-Supplier ID -> FK) --++(3,0) |- (Supplier Table-Supplier ID -> PK) ;
\end{tikzpicture}

\end{document}

答案2

zig zag to僅在具有不同座標的點之間才能正常工作x

您可以定義另一種樣式,例如,zig zig to它適用於具有相同點的點x,並使用它來定義新的one to many bis

one to many透過新增對 的參數的存取權限進行了更改zig zag to。這樣邊緣就不會重疊。

這是代碼:

\documentclass[border=0.25in]{standalone}

\usepackage{tikz}
\usetikzlibrary{shapes.multipart}
\usetikzlibrary{matrix}
\usetikzlibrary{positioning}
\usetikzlibrary{shadows}
\usetikzlibrary{calc}

\makeatletter
\pgfarrowsdeclare{crow's foot}{crow's foot}
{
  \pgfarrowsleftextend{+-.5\pgflinewidth}%
  \pgfarrowsrightextend{+.5\pgflinewidth}%
}
{
  \pgfutil@tempdima=0.5pt%
  \advance\pgfutil@tempdima by.25\pgflinewidth%
  \pgfsetdash{}{+0pt}%
  \pgfsetmiterjoin%
  \pgfpathmoveto{\pgfqpoint{0pt}{-6\pgfutil@tempdima}}%
  \pgfpathlineto{\pgfqpoint{-6\pgfutil@tempdima}{0pt}}%
  \pgfpathlineto{\pgfqpoint{0pt}{6\pgfutil@tempdima}}%
  \pgfusepathqstroke%
}


\tikzset{
    entity/.code={
        \tikzset{
            label=above:#1,
            name=#1,
            inner sep=0pt,
            every entity/.try,
            fill=white,
            general shadow={
                shadow xshift=0.0625in,
                shadow yshift=-0.0625in,
                opacity=0.5,
                fill=black!50
            }
        }%
        \def\entityname{#1}%
    },
    entity anchor/.style={matrix anchor=#1.center},
    every entity/.style={
            draw,
    },
    every property/.style={
        inner xsep=0.25cm, inner ysep=0.125cm, anchor=west, text width=1.5in
    },
    zig zag to/.style={
        to path={(\tikztostart) -| ($(\tikztostart)!#1!(\tikztotarget)$) |- (\tikztotarget)}
    },
    zig zag to/.default=0.5,
    zig zig to/.style={
        to path={(\tikztostart) -| ++(#1,0) |- (\tikztotarget)}
    },
    zig zig to/.default=2.5cm,
    one to many/.style={
        -crow's foot, zig zag to=#1
    },
    one to many bis/.style={
        -crow's foot, zig zig to=#1
    },
    many to one/.style={
        crow's foot-, zig zig to=#1
    },
    many to many/.style={
        crow's foot-crow's foot, zig zag to=#1
    }
}
\def\property#1{\node[name=\entityname-#1, every property/.try]{#1};}
\def\properties{\begingroup\catcode`\_=11\relax\processproperties}
\def\processproperties#1{\endgroup%
    \def\propertycode{}%
    \foreach \p in {#1}{%
        \expandafter\expandafter\expandafter\gdef\expandafter\expandafter\expandafter\propertycode%
            \expandafter\expandafter\expandafter{\expandafter\propertycode\expandafter\property\expandafter{\p}\\}%
    }%
    \propertycode%
}

\begin{document}

\begin{tikzpicture}[every node/.style={font=\ttfamily}, node distance=1.25in]

\matrix [entity=Order Form, entity anchor=Order Form-Order ID -> PK]  {
    \properties{
        Order ID -> PK,
        Cust ID -> FK,
        Order Date
    }
};

\matrix  [entity=Product Table, right=of Order Form-Order ID -> PK, entity anchor=Product Table-Vinyl ID -> PK]  {
    \properties{
        Vinyl ID -> PK,
        title,
        release year,
        record lbl,
        artist,
        album / single,
        cost price,
        Supplier ID -> FK,
        Retail Price,
        Reorder Lvl,
        Stock Lvl
    }
};

\matrix  [entity=Supplier Table, below=of Product Table, entity anchor=Supplier Table-Supplier ID -> PK]  {
    \properties{
        Supplier ID -> PK,
        Supplier Name,
        Sup Add 1,
        Sup Add 2,
        Sup Add 3
    }
};

\matrix  [entity=Order Details, left=of Supplier Table, entity anchor=Order Details-Vinyl ID -> FK]  {
    \properties{
        Vinyl ID -> FK,
        Order ID -> FK,
        Quantity
    }
};


\matrix  [entity=Customer Table, below=of Supplier Table, entity anchor=Customer Table-Cust ID]  {
    \properties{
        Cust ID,
        First Name,
        Surname,
        Email,
        Postcode,
        Add. Line 1,
        Add. Line 2,
        Add. Line 3
    }
};

\draw [one to many=.45 ] (Product Table-Vinyl ID -> PK) to (Order Details-Vinyl ID -> FK);
\draw [one to many bis=-3cm] (Order Form-Order ID -> PK)   to (Order Details-Order ID -> FK);
\draw [one to many] (Customer Table-Cust ID) to (Order Form-Cust ID -> FK);
\draw [one to many bis=3cm] (Supplier Table-Supplier ID -> PK)  to (Product Table-Supplier ID -> FK);
\end{tikzpicture}

\end{document}

在此輸入影像描述

相關內容