Ich habe Code angepasstaus diesem Beitrag
Mein Problem besteht darin, dass die Beziehungen (Linien) zwischen den Tabellen die Tabellen kreuzen, anstatt um sie herumzulaufen.
Das MWE ist ziemlich lang, aber hier ist es:
\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}
Hier ist ein Bild des Problems (das vielleicht sofort klarer ist) -
Ich bin nicht sicher, wie ich verhindern kann, dass die Linien wie derzeit über die Kästchen laufen. Ich kann dort keinen Wert finden, der geändert werden kann, um dieses Verhalten zu verhindern.
Nebenbei bemerkt - dies scheint ziemlich arbeitsintensiv zu sein, wenn es Vorschläge von anderen für alternative Methoden gibt, würde ich mich freuen, davon zu hören
Danke
Antwort1
Dies ist eine mögliche Lösung. Der zig zag to
Stil wird auf einen Standardwert von 0,5 gesetzt durch
zig zag to/.default=0.5
weiter, one to many
und die folgenden beiden Stile verwenden auch diesen Standardwert, was zu Fehlern führt. Dieser Vorschlag entfernt den zig zag to
in der one to many
Stildefinition und verwendet daher nicht
\draw (<start>) to (<end>)
Syntax in den draw
Befehlen. Verwenden Sie stattdessen die oft verwendeten relativen und orthogonalen Koordinatenzeichenfähigkeiten.
\draw (<start>) --++(x,0) |- (<end>);
weil die internen Beschriftungen (<start>)
und (<end>)
weiterhin gültig sind und lokale Koordinaten enthalten.
Code
\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}
Antwort2
Ihr zig zag to
funktioniert nur zwischen Punkten mit unterschiedlichen x
Koordinaten.
Sie können beispielsweise einen anderen Stil definieren, zig zig to
der für Punkte mit demselben gut geeignet ist, x
und ihn zum Definieren neuer verwenden one to many bis
.
Ich habe dies geändert, one to many
indem ich Zugriff auf den Parameter von hinzugefügt habe zig zag to
. Auf diese Weise überlappen sich Kanten nicht.
Hier ist der Code:
\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}