Merge pull request #458 from gavin-ts/fix_sql_table_overflow

render: fix sql table overflow
This commit is contained in:
gavin-ts 2022-12-19 23:47:36 -08:00 committed by GitHub
commit fa07ee5ea2
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
26 changed files with 1826 additions and 259 deletions

View file

@ -7,3 +7,4 @@
#### Bugfixes ⛑️ #### Bugfixes ⛑️
- `d2 fmt` only rewrites if it has changes, instead of always rewriting. [#470](https://github.com/terrastruct/d2/pull/470) - `d2 fmt` only rewrites if it has changes, instead of always rewriting. [#470](https://github.com/terrastruct/d2/pull/470)
- Fixed an issue where text could overflow in sql_table shapes. [#458](https://github.com/terrastruct/d2/pull/458)

View file

@ -669,8 +669,8 @@ func (c *compiler) compileSQLTable(obj *d2graph.Object) {
typ = "" typ = ""
} }
d2Col := d2target.SQLColumn{ d2Col := d2target.SQLColumn{
Name: col.IDVal, Name: d2target.Text{Label: col.IDVal},
Type: typ, Type: d2target.Text{Label: typ},
} }
// The only map a sql table field could have is to specify constraint // The only map a sql table field could have is to specify constraint
if col.Map != nil { if col.Map != nil {

View file

@ -1465,8 +1465,8 @@ b`, g.Objects[0].Attributes.Label.Value)
if len(g.Objects) != 1 { if len(g.Objects) != 1 {
t.Fatal(g.Objects) t.Fatal(g.Objects)
} }
assert.String(t, `GetType()`, g.Objects[0].SQLTable.Columns[0].Name) assert.String(t, `GetType()`, g.Objects[0].SQLTable.Columns[0].Name.Label)
assert.String(t, `Is()`, g.Objects[0].SQLTable.Columns[1].Name) assert.String(t, `Is()`, g.Objects[0].SQLTable.Columns[1].Name.Label)
}, },
}, },
{ {
@ -1490,8 +1490,8 @@ b`, g.Objects[0].Attributes.Label.Value)
if len(g.Objects[0].ChildrenArray) != 1 { if len(g.Objects[0].ChildrenArray) != 1 {
t.Fatal(g.Objects) t.Fatal(g.Objects)
} }
assert.String(t, `GetType()`, g.Objects[1].SQLTable.Columns[0].Name) assert.String(t, `GetType()`, g.Objects[1].SQLTable.Columns[0].Name.Label)
assert.String(t, `Is()`, g.Objects[1].SQLTable.Columns[1].Name) assert.String(t, `Is()`, g.Objects[1].SQLTable.Columns[1].Name.Label)
}, },
}, },
{ {

View file

@ -995,23 +995,38 @@ func (g *Graph) SetDimensions(mtexts []*d2target.MText, ruler *textmeasure.Ruler
obj.Width = float64(maxWidth + 100) obj.Width = float64(maxWidth + 100)
case d2target.ShapeSQLTable: case d2target.ShapeSQLTable:
maxWidth := dims.Width maxNameWidth := 0
maxTypeWidth := 0
constraintWidth := 0
for _, c := range obj.SQLTable.Columns { font := d2fonts.SourceSansPro.Font(d2fonts.FONT_SIZE_L, d2fonts.FONT_STYLE_REGULAR)
cdims := getTextDimensions(mtexts, ruler, c.Text()) for i := range obj.SQLTable.Columns {
if cdims == nil { // Note: we want to set dimensions of actual column not the for loop copy of the struct
return fmt.Errorf("dimensions for column %#v not found", c.Text()) c := &obj.SQLTable.Columns[i]
nameWidth, nameHeight := ruler.Measure(font, c.Name.Label)
c.Name.LabelWidth = nameWidth
c.Name.LabelHeight = nameHeight
if maxNameWidth < nameWidth {
maxNameWidth = nameWidth
} }
lineWidth := cdims.Width
if maxWidth < lineWidth { typeWidth, typeHeight := ruler.Measure(font, c.Type.Label)
maxWidth = lineWidth c.Type.LabelWidth = typeWidth
c.Type.LabelHeight = typeHeight
if maxTypeWidth < typeWidth {
maxTypeWidth = typeWidth
}
if c.Constraint != "" {
// covers UNQ constraint with padding
constraintWidth = 60
} }
} }
// The rows get padded a little due to header font being larger than row font // The rows get padded a little due to header font being larger than row font
obj.Height = float64(dims.Height * (len(obj.SQLTable.Columns) + 1)) obj.Height = float64(dims.Height * (len(obj.SQLTable.Columns) + 1))
// Leave room for padding obj.Width = float64(d2target.NamePadding + maxNameWidth + d2target.TypePadding + maxTypeWidth + d2target.TypePadding + constraintWidth)
obj.Width = float64(maxWidth + 100)
case d2target.ShapeText, d2target.ShapeCode: case d2target.ShapeText, d2target.ShapeCode:
} }

View file

@ -3,12 +3,12 @@ package d2svg
import ( import (
"fmt" "fmt"
"io" "io"
"math"
"strings" "strings"
"oss.terrastruct.com/d2/d2target" "oss.terrastruct.com/d2/d2target"
"oss.terrastruct.com/d2/lib/geo" "oss.terrastruct.com/d2/lib/geo"
"oss.terrastruct.com/d2/lib/label" "oss.terrastruct.com/d2/lib/label"
"oss.terrastruct.com/util-go/go2"
) )
func tableHeader(box *geo.Box, text string, textWidth, textHeight, fontSize float64) string { func tableHeader(box *geo.Box, text string, textWidth, textHeight, fontSize float64) string {
@ -43,13 +43,13 @@ func tableRow(box *geo.Box, nameText, typeText, constraintText string, fontSize,
// e.g. | diagram int FK | // e.g. | diagram int FK |
nameTL := label.InsideMiddleLeft.GetPointOnBox( nameTL := label.InsideMiddleLeft.GetPointOnBox(
box, box,
prefixPadding, d2target.NamePadding,
box.Width, box.Width,
fontSize, fontSize,
) )
constraintTR := label.InsideMiddleRight.GetPointOnBox( constraintTR := label.InsideMiddleRight.GetPointOnBox(
box, box,
typePadding, d2target.TypePadding,
0, 0,
fontSize, fontSize,
) )
@ -69,7 +69,7 @@ func tableRow(box *geo.Box, nameText, typeText, constraintText string, fontSize,
// TODO light font // TODO light font
fmt.Sprintf(`<text class="text" x="%f" y="%f" style="%s">%s</text>`, fmt.Sprintf(`<text class="text" x="%f" y="%f" style="%s">%s</text>`,
nameTL.X+longestNameWidth, nameTL.X+longestNameWidth+2*d2target.NamePadding,
nameTL.Y+fontSize*3/4, nameTL.Y+fontSize*3/4,
fmt.Sprintf("text-anchor:%s;font-size:%vpx;fill:%s", "start", fontSize, neutralColor), fmt.Sprintf("text-anchor:%s;font-size:%vpx;fill:%s", "start", fontSize, neutralColor),
escapeText(typeText), escapeText(typeText),
@ -113,18 +113,16 @@ func drawTable(writer io.Writer, targetShape d2target.Shape) {
tableHeader(headerBox, targetShape.Label, float64(targetShape.LabelWidth), float64(targetShape.LabelHeight), float64(targetShape.FontSize)), tableHeader(headerBox, targetShape.Label, float64(targetShape.LabelWidth), float64(targetShape.LabelHeight), float64(targetShape.FontSize)),
) )
fontSize := float64(targetShape.FontSize) var longestNameWidth int
var longestNameWidth float64
for _, f := range targetShape.SQLTable.Columns { for _, f := range targetShape.SQLTable.Columns {
// TODO measure text longestNameWidth = go2.Max(longestNameWidth, f.Name.LabelWidth)
longestNameWidth = math.Max(longestNameWidth, float64(len(f.Name))*fontSize*5/9)
} }
rowBox := geo.NewBox(box.TopLeft.Copy(), box.Width, rowHeight) rowBox := geo.NewBox(box.TopLeft.Copy(), box.Width, rowHeight)
rowBox.TopLeft.Y += headerBox.Height rowBox.TopLeft.Y += headerBox.Height
for _, f := range targetShape.SQLTable.Columns { for _, f := range targetShape.SQLTable.Columns {
fmt.Fprint(writer, fmt.Fprint(writer,
tableRow(rowBox, f.Name, f.Type, constraintAbbr(f.Constraint), fontSize, longestNameWidth), tableRow(rowBox, f.Name.Label, f.Type.Label, constraintAbbr(f.Constraint), float64(targetShape.FontSize), float64(longestNameWidth)),
) )
rowBox.TopLeft.Y += rowHeight rowBox.TopLeft.Y += rowHeight
fmt.Fprintf(writer, `<line x1="%f" y1="%f" x2="%f" y2="%f" style="stroke-width:2;stroke:#0a0f25" />`, fmt.Fprintf(writer, `<line x1="%f" y1="%f" x2="%f" y2="%f" style="stroke-width:2;stroke:#0a0f25" />`,
@ -132,5 +130,4 @@ func drawTable(writer io.Writer, targetShape d2target.Shape) {
rowBox.TopLeft.X+rowBox.Width, rowBox.TopLeft.Y, rowBox.TopLeft.X+rowBox.Width, rowBox.TopLeft.Y,
) )
} }
} }

View file

@ -6,20 +6,25 @@ import (
"oss.terrastruct.com/d2/d2renderers/d2fonts" "oss.terrastruct.com/d2/d2renderers/d2fonts"
) )
const (
NamePadding = 10
TypePadding = 20
)
type SQLTable struct { type SQLTable struct {
Columns []SQLColumn `json:"columns"` Columns []SQLColumn `json:"columns"`
} }
type SQLColumn struct { type SQLColumn struct {
Name string `json:"name"` Name Text `json:"name"`
Type string `json:"type"` Type Text `json:"type"`
Constraint string `json:"constraint"` Constraint string `json:"constraint"`
Reference string `json:"reference"` Reference string `json:"reference"`
} }
func (c SQLColumn) Text() *MText { func (c SQLColumn) Text() *MText {
return &MText{ return &MText{
Text: fmt.Sprintf("%s%s%s%s", c.Name, c.Type, c.Constraint, c.Reference), Text: fmt.Sprintf("%s%s%s%s", c.Name.Label, c.Type.Label, c.Constraint, c.Reference),
FontSize: d2fonts.FONT_SIZE_L, FontSize: d2fonts.FONT_SIZE_L,
IsBold: false, IsBold: false,
IsItalic: false, IsItalic: false,

View file

@ -52,6 +52,25 @@ foobar: {
} }
foo -> foobar`, foo -> foobar`,
}, },
{
name: "sql_table_overflow",
script: `
table: sql_table_overflow {
shape: sql_table
short: loooooooooooooooooooong
loooooooooooooooooooong: short
}
table_constrained: sql_table_constrained_overflow {
shape: sql_table
short: loooooooooooooooooooong {
constraint: unique
}
loooooooooooooooooooong: short {
constraint: foreign_key
}
}
`,
},
} }
runa(t, tcs) runa(t, tcs)

View file

@ -0,0 +1,198 @@
{
"name": "",
"shapes": [
{
"id": "table",
"type": "sql_table",
"pos": {
"x": 0,
"y": 0
},
"width": 534,
"height": 108,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "#FFFFFF",
"stroke": "#0A0F25",
"shadow": false,
"3d": false,
"multiple": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": [
{
"name": {
"label": "short",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 45,
"labelHeight": 26
},
"type": {
"label": "loooooooooooooooooooong",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 242,
"labelHeight": 26
},
"constraint": "",
"reference": ""
},
{
"name": {
"label": "loooooooooooooooooooong",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 242,
"labelHeight": 26
},
"type": {
"label": "short",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 45,
"labelHeight": 26
},
"constraint": "",
"reference": ""
}
],
"label": "sql_table_overflow",
"fontSize": 20,
"fontFamily": "DEFAULT",
"language": "",
"color": "#0A0F25",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 211,
"labelHeight": 36,
"zIndex": 0,
"level": 1
},
{
"id": "table_constrained",
"type": "sql_table",
"pos": {
"x": 594,
"y": 0
},
"width": 594,
"height": 108,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "#FFFFFF",
"stroke": "#0A0F25",
"shadow": false,
"3d": false,
"multiple": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": [
{
"name": {
"label": "short",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 45,
"labelHeight": 26
},
"type": {
"label": "loooooooooooooooooooong",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 242,
"labelHeight": 26
},
"constraint": "unique",
"reference": ""
},
{
"name": {
"label": "loooooooooooooooooooong",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 242,
"labelHeight": 26
},
"type": {
"label": "short",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 45,
"labelHeight": 26
},
"constraint": "foreign_key",
"reference": ""
}
],
"label": "sql_table_constrained_overflow",
"fontSize": 20,
"fontFamily": "DEFAULT",
"language": "",
"color": "#0A0F25",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 350,
"labelHeight": 36,
"zIndex": 0,
"level": 1
}
],
"connections": []
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 327 KiB

View file

@ -0,0 +1,198 @@
{
"name": "",
"shapes": [
{
"id": "table",
"type": "sql_table",
"pos": {
"x": 12,
"y": 12
},
"width": 534,
"height": 108,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "#FFFFFF",
"stroke": "#0A0F25",
"shadow": false,
"3d": false,
"multiple": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": [
{
"name": {
"label": "short",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 45,
"labelHeight": 26
},
"type": {
"label": "loooooooooooooooooooong",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 242,
"labelHeight": 26
},
"constraint": "",
"reference": ""
},
{
"name": {
"label": "loooooooooooooooooooong",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 242,
"labelHeight": 26
},
"type": {
"label": "short",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 45,
"labelHeight": 26
},
"constraint": "",
"reference": ""
}
],
"label": "sql_table_overflow",
"fontSize": 20,
"fontFamily": "DEFAULT",
"language": "",
"color": "#0A0F25",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 211,
"labelHeight": 36,
"zIndex": 0,
"level": 1
},
{
"id": "table_constrained",
"type": "sql_table",
"pos": {
"x": 566,
"y": 12
},
"width": 594,
"height": 108,
"opacity": 1,
"strokeDash": 0,
"strokeWidth": 2,
"borderRadius": 0,
"fill": "#FFFFFF",
"stroke": "#0A0F25",
"shadow": false,
"3d": false,
"multiple": false,
"tooltip": "",
"link": "",
"icon": null,
"iconPosition": "",
"blend": false,
"fields": null,
"methods": null,
"columns": [
{
"name": {
"label": "short",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 45,
"labelHeight": 26
},
"type": {
"label": "loooooooooooooooooooong",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 242,
"labelHeight": 26
},
"constraint": "unique",
"reference": ""
},
{
"name": {
"label": "loooooooooooooooooooong",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 242,
"labelHeight": 26
},
"type": {
"label": "short",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 45,
"labelHeight": 26
},
"constraint": "foreign_key",
"reference": ""
}
],
"label": "sql_table_constrained_overflow",
"fontSize": 20,
"fontFamily": "DEFAULT",
"language": "",
"color": "#0A0F25",
"italic": false,
"bold": true,
"underline": false,
"labelWidth": 350,
"labelHeight": 36,
"zIndex": 0,
"level": 1
}
],
"connections": []
}

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 327 KiB

View file

@ -787,10 +787,10 @@
"id": "t", "id": "t",
"type": "sql_table", "type": "sql_table",
"pos": { "pos": {
"x": 4759, "x": 4783,
"y": 150 "y": 150
}, },
"width": 210, "width": 161,
"height": 108, "height": 108,
"opacity": 1, "opacity": 1,
"strokeDash": 0, "strokeDash": 0,
@ -810,14 +810,58 @@
"methods": null, "methods": null,
"columns": [ "columns": [
{ {
"name": "id", "name": {
"type": "int", "label": "id",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 15,
"labelHeight": 26
},
"type": {
"label": "int",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 23,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
}, },
{ {
"name": "name", "name": {
"type": "varchar", "label": "name",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 47,
"labelHeight": 26
},
"type": {
"label": "varchar",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 64,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
} }
@ -1570,7 +1614,7 @@
"y": 2728 "y": 2728
}, },
{ {
"x": 4864, "x": 4863.5,
"y": 2728 "y": 2728
} }
], ],
@ -2346,11 +2390,11 @@
"labelPercentage": 0, "labelPercentage": 0,
"route": [ "route": [
{ {
"x": 4864, "x": 4863.5,
"y": 258 "y": 258
}, },
{ {
"x": 4864, "x": 4863.5,
"y": 2858 "y": 2858
} }
], ],

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 669 KiB

After

Width:  |  Height:  |  Size: 669 KiB

View file

@ -787,10 +787,10 @@
"id": "t", "id": "t",
"type": "sql_table", "type": "sql_table",
"pos": { "pos": {
"x": 4759, "x": 4783,
"y": 150 "y": 150
}, },
"width": 210, "width": 161,
"height": 108, "height": 108,
"opacity": 1, "opacity": 1,
"strokeDash": 0, "strokeDash": 0,
@ -810,14 +810,58 @@
"methods": null, "methods": null,
"columns": [ "columns": [
{ {
"name": "id", "name": {
"type": "int", "label": "id",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 15,
"labelHeight": 26
},
"type": {
"label": "int",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 23,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
}, },
{ {
"name": "name", "name": {
"type": "varchar", "label": "name",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 47,
"labelHeight": 26
},
"type": {
"label": "varchar",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 64,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
} }
@ -1570,7 +1614,7 @@
"y": 2728 "y": 2728
}, },
{ {
"x": 4864, "x": 4863.5,
"y": 2728 "y": 2728
} }
], ],
@ -2346,11 +2390,11 @@
"labelPercentage": 0, "labelPercentage": 0,
"route": [ "route": [
{ {
"x": 4864, "x": 4863.5,
"y": 258 "y": 258
}, },
{ {
"x": 4864, "x": 4863.5,
"y": 2858 "y": 2858
} }
], ],

File diff suppressed because one or more lines are too long

Before

Width:  |  Height:  |  Size: 669 KiB

After

Width:  |  Height:  |  Size: 669 KiB

View file

@ -8,7 +8,7 @@
"x": 0, "x": 0,
"y": 0 "y": 0
}, },
"width": 259, "width": 208,
"height": 216, "height": 216,
"opacity": 1, "opacity": 1,
"strokeDash": 0, "strokeDash": 0,
@ -28,32 +28,142 @@
"methods": null, "methods": null,
"columns": [ "columns": [
{ {
"name": "id", "name": {
"type": "int", "label": "id",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 15,
"labelHeight": 26
},
"type": {
"label": "int",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 23,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "orders.user_id" "reference": "orders.user_id"
}, },
{ {
"name": "name", "name": {
"type": "string", "label": "name",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 47,
"labelHeight": 26
},
"type": {
"label": "string",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 48,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
}, },
{ {
"name": "email", "name": {
"type": "string", "label": "email",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 47,
"labelHeight": 26
},
"type": {
"label": "string",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 48,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
}, },
{ {
"name": "password", "name": {
"type": "string", "label": "password",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 80,
"labelHeight": 26
},
"type": {
"label": "string",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 48,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
}, },
{ {
"name": "last_login", "name": {
"type": "datetime", "label": "last_login",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 81,
"labelHeight": 26
},
"type": {
"label": "datetime",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 77,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
} }
@ -75,10 +185,10 @@
"id": "products", "id": "products",
"type": "sql_table", "type": "sql_table",
"pos": { "pos": {
"x": 319, "x": 268,
"y": 18 "y": 18
}, },
"width": 290, "width": 164,
"height": 180, "height": 180,
"opacity": 1, "opacity": 1,
"strokeDash": 0, "strokeDash": 0,
@ -98,26 +208,114 @@
"methods": null, "methods": null,
"columns": [ "columns": [
{ {
"name": "id", "name": {
"type": "int", "label": "id",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 15,
"labelHeight": 26
},
"type": {
"label": "int",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 23,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "orders.product_id" "reference": "orders.product_id"
}, },
{ {
"name": "price", "name": {
"type": "decimal", "label": "price",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 42,
"labelHeight": 26
},
"type": {
"label": "decimal",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 67,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
}, },
{ {
"name": "sku", "name": {
"type": "string", "label": "sku",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 29,
"labelHeight": 26
},
"type": {
"label": "string",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 48,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
}, },
{ {
"name": "name", "name": {
"type": "string", "label": "name",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 47,
"labelHeight": 26
},
"type": {
"label": "string",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 48,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
} }
@ -139,10 +337,10 @@
"id": "orders", "id": "orders",
"type": "sql_table", "type": "sql_table",
"pos": { "pos": {
"x": 357, "x": 268,
"y": 316 "y": 316
}, },
"width": 215, "width": 164,
"height": 144, "height": 144,
"opacity": 1, "opacity": 1,
"strokeDash": 0, "strokeDash": 0,
@ -162,20 +360,86 @@
"methods": null, "methods": null,
"columns": [ "columns": [
{ {
"name": "id", "name": {
"type": "int", "label": "id",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 15,
"labelHeight": 26
},
"type": {
"label": "int",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 23,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
}, },
{ {
"name": "user_id", "name": {
"type": "int", "label": "user_id",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 61,
"labelHeight": 26
},
"type": {
"label": "int",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 23,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
}, },
{ {
"name": "product_id", "name": {
"type": "int", "label": "product_id",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 91,
"labelHeight": 26
},
"type": {
"label": "int",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 23,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
} }
@ -197,10 +461,10 @@
"id": "shipments", "id": "shipments",
"type": "sql_table", "type": "sql_table",
"pos": { "pos": {
"x": 669, "x": 492,
"y": 18 "y": 18
}, },
"width": 293, "width": 244,
"height": 180, "height": 180,
"opacity": 1, "opacity": 1,
"strokeDash": 0, "strokeDash": 0,
@ -220,26 +484,114 @@
"methods": null, "methods": null,
"columns": [ "columns": [
{ {
"name": "id", "name": {
"type": "int", "label": "id",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 15,
"labelHeight": 26
},
"type": {
"label": "int",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 23,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
}, },
{ {
"name": "order_id", "name": {
"type": "int", "label": "order_id",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 71,
"labelHeight": 26
},
"type": {
"label": "int",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 23,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "orders.id" "reference": "orders.id"
}, },
{ {
"name": "tracking_number", "name": {
"type": "string", "label": "tracking_number",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 146,
"labelHeight": 26
},
"type": {
"label": "string",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 48,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
}, },
{ {
"name": "status", "name": {
"type": "string", "label": "status",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 51,
"labelHeight": 26
},
"type": {
"label": "string",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 48,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
} }
@ -285,20 +637,20 @@
"labelPercentage": 0, "labelPercentage": 0,
"route": [ "route": [
{ {
"x": 129.5, "x": 104,
"y": 216 "y": 216
}, },
{ {
"x": 129.5, "x": 104,
"y": 256 "y": 256
}, },
{ {
"x": 174.9, "x": 136.8,
"y": 282.55844544095663 "y": 282.2
}, },
{ {
"x": 356.5, "x": 268,
"y": 348.7922272047833 "y": 347
} }
], ],
"isCurve": true, "isCurve": true,
@ -333,19 +685,19 @@
"labelPercentage": 0, "labelPercentage": 0,
"route": [ "route": [
{ {
"x": 464, "x": 350,
"y": 198 "y": 198
}, },
{ {
"x": 464, "x": 350,
"y": 252.4 "y": 252.4
}, },
{ {
"x": 464, "x": 350,
"y": 276 "y": 276
}, },
{ {
"x": 464, "x": 350,
"y": 316 "y": 316
} }
], ],
@ -381,20 +733,20 @@
"labelPercentage": 0, "labelPercentage": 0,
"route": [ "route": [
{ {
"x": 815.5, "x": 614,
"y": 198 "y": 198
}, },
{ {
"x": 815.5, "x": 614,
"y": 252.4 "y": 252.4
}, },
{ {
"x": 766.7, "x": 577.6,
"y": 283 "y": 282.8
}, },
{ {
"x": 571.5, "x": 432,
"y": 351 "y": 350
} }
], ],
"isCurve": true, "isCurve": true,

View file

@ -2,7 +2,7 @@
<svg <svg
style="background: white;" style="background: white;"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="1162" height="660" viewBox="-100 -100 1162 660"><style type="text/css"> width="936" height="660" viewBox="-100 -100 936 660"><style type="text/css">
<![CDATA[ <![CDATA[
.shape { .shape {
shape-rendering: geometricPrecision; shape-rendering: geometricPrecision;
@ -18,40 +18,40 @@ width="1162" height="660" viewBox="-100 -100 1162 660"><style type="text/css">
} }
]]> ]]>
</style><g id="users"><g class="shape" ><rect class="shape" x="0" y="0" width="259" height="216" style="fill:#FFFFFF;stroke:#0A0F25;opacity:1.000000;stroke-width:2;"/><rect class="class_header" x="0.000000" y="0.000000" width="259.000000" height="36.000000" fill="#0a0f25" /><text class="text" x="20.000000" y="27.000000" style="text-anchor:start;font-size:24px;fill:white">users</text><text class="text" x="10.000000" y="59.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">id</text> </style><g id="users"><g class="shape" ><rect class="shape" x="0" y="0" width="208" height="216" style="fill:#FFFFFF;stroke:#0A0F25;opacity:1.000000;stroke-width:2;"/><rect class="class_header" x="0.000000" y="0.000000" width="208.000000" height="36.000000" fill="#0a0f25" /><text class="text" x="20.000000" y="27.000000" style="text-anchor:start;font-size:24px;fill:white">users</text><text class="text" x="10.000000" y="59.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">id</text>
<text class="text" x="121.111111" y="59.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text> <text class="text" x="111.000000" y="59.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text>
<text class="text" x="239.000000" y="59.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="0.000000" y1="72.000000" x2="259.000000" y2="72.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="10.000000" y="95.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">name</text> <text class="text" x="188.000000" y="59.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="0.000000" y1="72.000000" x2="208.000000" y2="72.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="10.000000" y="95.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">name</text>
<text class="text" x="121.111111" y="95.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text> <text class="text" x="111.000000" y="95.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text>
<text class="text" x="239.000000" y="95.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="0.000000" y1="108.000000" x2="259.000000" y2="108.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="10.000000" y="131.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">email</text> <text class="text" x="188.000000" y="95.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="0.000000" y1="108.000000" x2="208.000000" y2="108.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="10.000000" y="131.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">email</text>
<text class="text" x="121.111111" y="131.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text> <text class="text" x="111.000000" y="131.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text>
<text class="text" x="239.000000" y="131.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="0.000000" y1="144.000000" x2="259.000000" y2="144.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="10.000000" y="167.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">password</text> <text class="text" x="188.000000" y="131.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="0.000000" y1="144.000000" x2="208.000000" y2="144.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="10.000000" y="167.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">password</text>
<text class="text" x="121.111111" y="167.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text> <text class="text" x="111.000000" y="167.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text>
<text class="text" x="239.000000" y="167.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="0.000000" y1="180.000000" x2="259.000000" y2="180.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="10.000000" y="203.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">last_login</text> <text class="text" x="188.000000" y="167.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="0.000000" y1="180.000000" x2="208.000000" y2="180.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="10.000000" y="203.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">last_login</text>
<text class="text" x="121.111111" y="203.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">datetime</text> <text class="text" x="111.000000" y="203.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">datetime</text>
<text class="text" x="239.000000" y="203.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="0.000000" y1="216.000000" x2="259.000000" y2="216.000000" style="stroke-width:2;stroke:#0a0f25" /></g></g><g id="products"><g class="shape" ><rect class="shape" x="319" y="18" width="290" height="180" style="fill:#FFFFFF;stroke:#0A0F25;opacity:1.000000;stroke-width:2;"/><rect class="class_header" x="319.000000" y="18.000000" width="290.000000" height="36.000000" fill="#0a0f25" /><text class="text" x="339.000000" y="45.000000" style="text-anchor:start;font-size:24px;fill:white">products</text><text class="text" x="329.000000" y="77.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">id</text> <text class="text" x="188.000000" y="203.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="0.000000" y1="216.000000" x2="208.000000" y2="216.000000" style="stroke-width:2;stroke:#0a0f25" /></g></g><g id="products"><g class="shape" ><rect class="shape" x="268" y="18" width="164" height="180" style="fill:#FFFFFF;stroke:#0A0F25;opacity:1.000000;stroke-width:2;"/><rect class="class_header" x="268.000000" y="18.000000" width="164.000000" height="36.000000" fill="#0a0f25" /><text class="text" x="288.000000" y="45.000000" style="text-anchor:start;font-size:24px;fill:white">products</text><text class="text" x="278.000000" y="77.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">id</text>
<text class="text" x="384.555556" y="77.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text> <text class="text" x="345.000000" y="77.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text>
<text class="text" x="589.000000" y="77.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="319.000000" y1="90.000000" x2="609.000000" y2="90.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="329.000000" y="113.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">price</text> <text class="text" x="412.000000" y="77.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="268.000000" y1="90.000000" x2="432.000000" y2="90.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="278.000000" y="113.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">price</text>
<text class="text" x="384.555556" y="113.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">decimal</text> <text class="text" x="345.000000" y="113.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">decimal</text>
<text class="text" x="589.000000" y="113.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="319.000000" y1="126.000000" x2="609.000000" y2="126.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="329.000000" y="149.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">sku</text> <text class="text" x="412.000000" y="113.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="268.000000" y1="126.000000" x2="432.000000" y2="126.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="278.000000" y="149.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">sku</text>
<text class="text" x="384.555556" y="149.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text> <text class="text" x="345.000000" y="149.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text>
<text class="text" x="589.000000" y="149.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="319.000000" y1="162.000000" x2="609.000000" y2="162.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="329.000000" y="185.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">name</text> <text class="text" x="412.000000" y="149.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="268.000000" y1="162.000000" x2="432.000000" y2="162.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="278.000000" y="185.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">name</text>
<text class="text" x="384.555556" y="185.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text> <text class="text" x="345.000000" y="185.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text>
<text class="text" x="589.000000" y="185.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="319.000000" y1="198.000000" x2="609.000000" y2="198.000000" style="stroke-width:2;stroke:#0a0f25" /></g></g><g id="orders"><g class="shape" ><rect class="shape" x="357" y="316" width="215" height="144" style="fill:#FFFFFF;stroke:#0A0F25;opacity:1.000000;stroke-width:2;"/><rect class="class_header" x="357.000000" y="316.000000" width="215.000000" height="36.000000" fill="#0a0f25" /><text class="text" x="377.000000" y="343.000000" style="text-anchor:start;font-size:24px;fill:white">orders</text><text class="text" x="367.000000" y="375.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">id</text> <text class="text" x="412.000000" y="185.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="268.000000" y1="198.000000" x2="432.000000" y2="198.000000" style="stroke-width:2;stroke:#0a0f25" /></g></g><g id="orders"><g class="shape" ><rect class="shape" x="268" y="316" width="164" height="144" style="fill:#FFFFFF;stroke:#0A0F25;opacity:1.000000;stroke-width:2;"/><rect class="class_header" x="268.000000" y="316.000000" width="164.000000" height="36.000000" fill="#0a0f25" /><text class="text" x="288.000000" y="343.000000" style="text-anchor:start;font-size:24px;fill:white">orders</text><text class="text" x="278.000000" y="375.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">id</text>
<text class="text" x="478.111111" y="375.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text> <text class="text" x="389.000000" y="375.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text>
<text class="text" x="552.000000" y="375.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="357.000000" y1="388.000000" x2="572.000000" y2="388.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="367.000000" y="411.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">user_id</text> <text class="text" x="412.000000" y="375.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="268.000000" y1="388.000000" x2="432.000000" y2="388.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="278.000000" y="411.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">user_id</text>
<text class="text" x="478.111111" y="411.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text> <text class="text" x="389.000000" y="411.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text>
<text class="text" x="552.000000" y="411.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="357.000000" y1="424.000000" x2="572.000000" y2="424.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="367.000000" y="447.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">product_id</text> <text class="text" x="412.000000" y="411.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="268.000000" y1="424.000000" x2="432.000000" y2="424.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="278.000000" y="447.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">product_id</text>
<text class="text" x="478.111111" y="447.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text> <text class="text" x="389.000000" y="447.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text>
<text class="text" x="552.000000" y="447.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="357.000000" y1="460.000000" x2="572.000000" y2="460.000000" style="stroke-width:2;stroke:#0a0f25" /></g></g><g id="shipments"><g class="shape" ><rect class="shape" x="669" y="18" width="293" height="180" style="fill:#FFFFFF;stroke:#0A0F25;opacity:1.000000;stroke-width:2;"/><rect class="class_header" x="669.000000" y="18.000000" width="293.000000" height="36.000000" fill="#0a0f25" /><text class="text" x="689.000000" y="45.000000" style="text-anchor:start;font-size:24px;fill:white">shipments</text><text class="text" x="679.000000" y="77.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">id</text> <text class="text" x="412.000000" y="447.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="268.000000" y1="460.000000" x2="432.000000" y2="460.000000" style="stroke-width:2;stroke:#0a0f25" /></g></g><g id="shipments"><g class="shape" ><rect class="shape" x="492" y="18" width="244" height="180" style="fill:#FFFFFF;stroke:#0A0F25;opacity:1.000000;stroke-width:2;"/><rect class="class_header" x="492.000000" y="18.000000" width="244.000000" height="36.000000" fill="#0a0f25" /><text class="text" x="512.000000" y="45.000000" style="text-anchor:start;font-size:24px;fill:white">shipments</text><text class="text" x="502.000000" y="77.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">id</text>
<text class="text" x="845.666667" y="77.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text> <text class="text" x="668.000000" y="77.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text>
<text class="text" x="942.000000" y="77.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="669.000000" y1="90.000000" x2="962.000000" y2="90.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="679.000000" y="113.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">order_id</text> <text class="text" x="716.000000" y="77.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="492.000000" y1="90.000000" x2="736.000000" y2="90.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="502.000000" y="113.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">order_id</text>
<text class="text" x="845.666667" y="113.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text> <text class="text" x="668.000000" y="113.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text>
<text class="text" x="942.000000" y="113.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="669.000000" y1="126.000000" x2="962.000000" y2="126.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="679.000000" y="149.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">tracking_number</text> <text class="text" x="716.000000" y="113.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="492.000000" y1="126.000000" x2="736.000000" y2="126.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="502.000000" y="149.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">tracking_number</text>
<text class="text" x="845.666667" y="149.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text> <text class="text" x="668.000000" y="149.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text>
<text class="text" x="942.000000" y="149.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="669.000000" y1="162.000000" x2="962.000000" y2="162.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="679.000000" y="185.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">status</text> <text class="text" x="716.000000" y="149.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="492.000000" y1="162.000000" x2="736.000000" y2="162.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="502.000000" y="185.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">status</text>
<text class="text" x="845.666667" y="185.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text> <text class="text" x="668.000000" y="185.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text>
<text class="text" x="942.000000" y="185.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="669.000000" y1="198.000000" x2="962.000000" y2="198.000000" style="stroke-width:2;stroke:#0a0f25" /></g></g><g id="(users &lt;-&gt; orders)[0]"><marker id="mk-2510427236" markerWidth="10.000000" markerHeight="12.000000" refX="3.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon class="connection" fill="#0D32B2" stroke-width="2" points="10.000000,0.000000 0.000000,6.000000 10.000000,12.000000" /> </marker><marker id="mk-3990223579" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon class="connection" fill="#0D32B2" stroke-width="2" points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" /> </marker><path d="M 129.500000 220.000000 C 129.500000 256.000000 174.900000 282.558445 352.742140 347.421647" class="connection" style="fill:none;stroke:#0D32B2;opacity:1.000000;stroke-width:2;" marker-start="url(#mk-2510427236)" marker-end="url(#mk-3990223579)" mask="url(#3739746318)"/></g><g id="(products &lt;-&gt; orders)[0]"><path d="M 464.000000 202.000000 C 464.000000 252.400000 464.000000 276.000000 464.000000 312.000000" class="connection" style="fill:none;stroke:#0D32B2;opacity:1.000000;stroke-width:2;" marker-start="url(#mk-2510427236)" marker-end="url(#mk-3990223579)" mask="url(#3739746318)"/></g><g id="(shipments &lt;-&gt; orders)[0]"><path d="M 815.500000 202.000000 C 815.500000 252.400000 766.700000 283.000000 575.277360 349.684116" class="connection" style="fill:none;stroke:#0D32B2;opacity:1.000000;stroke-width:2;" marker-start="url(#mk-2510427236)" marker-end="url(#mk-3990223579)" mask="url(#3739746318)"/></g><mask id="3739746318" maskUnits="userSpaceOnUse" x="0" y="0" width="1162" height="660"> <text class="text" x="716.000000" y="185.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="492.000000" y1="198.000000" x2="736.000000" y2="198.000000" style="stroke-width:2;stroke:#0a0f25" /></g></g><g id="(users &lt;-&gt; orders)[0]"><marker id="mk-2510427236" markerWidth="10.000000" markerHeight="12.000000" refX="3.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon class="connection" fill="#0D32B2" stroke-width="2" points="10.000000,0.000000 0.000000,6.000000 10.000000,12.000000" /> </marker><marker id="mk-3990223579" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon class="connection" fill="#0D32B2" stroke-width="2" points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" /> </marker><path d="M 104.000000 220.000000 C 104.000000 256.000000 136.800000 282.200000 264.413587 345.228662" class="connection" style="fill:none;stroke:#0D32B2;opacity:1.000000;stroke-width:2;" marker-start="url(#mk-2510427236)" marker-end="url(#mk-3990223579)" mask="url(#3490208275)"/></g><g id="(products &lt;-&gt; orders)[0]"><path d="M 350.000000 202.000000 C 350.000000 252.400000 350.000000 276.000000 350.000000 312.000000" class="connection" style="fill:none;stroke:#0D32B2;opacity:1.000000;stroke-width:2;" marker-start="url(#mk-2510427236)" marker-end="url(#mk-3990223579)" mask="url(#3490208275)"/></g><g id="(shipments &lt;-&gt; orders)[0]"><path d="M 614.000000 202.000000 C 614.000000 252.400000 577.600000 282.800000 435.631838 348.323767" class="connection" style="fill:none;stroke:#0D32B2;opacity:1.000000;stroke-width:2;" marker-start="url(#mk-2510427236)" marker-end="url(#mk-3990223579)" mask="url(#3490208275)"/></g><mask id="3490208275" maskUnits="userSpaceOnUse" x="0" y="0" width="936" height="660">
<rect x="0" y="0" width="1162" height="660" fill="white"></rect> <rect x="0" y="0" width="936" height="660" fill="white"></rect>
</mask><style type="text/css"><![CDATA[ </mask><style type="text/css"><![CDATA[
.text { .text {

Before

Width:  |  Height:  |  Size: 335 KiB

After

Width:  |  Height:  |  Size: 335 KiB

View file

@ -5,10 +5,10 @@
"id": "users", "id": "users",
"type": "sql_table", "type": "sql_table",
"pos": { "pos": {
"x": 635, "x": 460,
"y": 12 "y": 12
}, },
"width": 259, "width": 208,
"height": 216, "height": 216,
"opacity": 1, "opacity": 1,
"strokeDash": 0, "strokeDash": 0,
@ -28,32 +28,142 @@
"methods": null, "methods": null,
"columns": [ "columns": [
{ {
"name": "id", "name": {
"type": "int", "label": "id",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 15,
"labelHeight": 26
},
"type": {
"label": "int",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 23,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "orders.user_id" "reference": "orders.user_id"
}, },
{ {
"name": "name", "name": {
"type": "string", "label": "name",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 47,
"labelHeight": 26
},
"type": {
"label": "string",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 48,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
}, },
{ {
"name": "email", "name": {
"type": "string", "label": "email",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 47,
"labelHeight": 26
},
"type": {
"label": "string",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 48,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
}, },
{ {
"name": "password", "name": {
"type": "string", "label": "password",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 80,
"labelHeight": 26
},
"type": {
"label": "string",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 48,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
}, },
{ {
"name": "last_login", "name": {
"type": "datetime", "label": "last_login",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 81,
"labelHeight": 26
},
"type": {
"label": "datetime",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 77,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
} }
@ -75,10 +185,10 @@
"id": "products", "id": "products",
"type": "sql_table", "type": "sql_table",
"pos": { "pos": {
"x": 325, "x": 276,
"y": 48 "y": 48
}, },
"width": 290, "width": 164,
"height": 180, "height": 180,
"opacity": 1, "opacity": 1,
"strokeDash": 0, "strokeDash": 0,
@ -98,26 +208,114 @@
"methods": null, "methods": null,
"columns": [ "columns": [
{ {
"name": "id", "name": {
"type": "int", "label": "id",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 15,
"labelHeight": 26
},
"type": {
"label": "int",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 23,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "orders.product_id" "reference": "orders.product_id"
}, },
{ {
"name": "price", "name": {
"type": "decimal", "label": "price",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 42,
"labelHeight": 26
},
"type": {
"label": "decimal",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 67,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
}, },
{ {
"name": "sku", "name": {
"type": "string", "label": "sku",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 29,
"labelHeight": 26
},
"type": {
"label": "string",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 48,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
}, },
{ {
"name": "name", "name": {
"type": "string", "label": "name",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 47,
"labelHeight": 26
},
"type": {
"label": "string",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 48,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
} }
@ -139,10 +337,10 @@
"id": "orders", "id": "orders",
"type": "sql_table", "type": "sql_table",
"pos": { "pos": {
"x": 363, "x": 276,
"y": 328 "y": 328
}, },
"width": 215, "width": 164,
"height": 144, "height": 144,
"opacity": 1, "opacity": 1,
"strokeDash": 0, "strokeDash": 0,
@ -162,20 +360,86 @@
"methods": null, "methods": null,
"columns": [ "columns": [
{ {
"name": "id", "name": {
"type": "int", "label": "id",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 15,
"labelHeight": 26
},
"type": {
"label": "int",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 23,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
}, },
{ {
"name": "user_id", "name": {
"type": "int", "label": "user_id",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 61,
"labelHeight": 26
},
"type": {
"label": "int",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 23,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
}, },
{ {
"name": "product_id", "name": {
"type": "int", "label": "product_id",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 91,
"labelHeight": 26
},
"type": {
"label": "int",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 23,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
} }
@ -200,7 +464,7 @@
"x": 12, "x": 12,
"y": 48 "y": 48
}, },
"width": 293, "width": 244,
"height": 180, "height": 180,
"opacity": 1, "opacity": 1,
"strokeDash": 0, "strokeDash": 0,
@ -220,26 +484,114 @@
"methods": null, "methods": null,
"columns": [ "columns": [
{ {
"name": "id", "name": {
"type": "int", "label": "id",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 15,
"labelHeight": 26
},
"type": {
"label": "int",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 23,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
}, },
{ {
"name": "order_id", "name": {
"type": "int", "label": "order_id",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 71,
"labelHeight": 26
},
"type": {
"label": "int",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 23,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "orders.id" "reference": "orders.id"
}, },
{ {
"name": "tracking_number", "name": {
"type": "string", "label": "tracking_number",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 146,
"labelHeight": 26
},
"type": {
"label": "string",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 48,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
}, },
{ {
"name": "status", "name": {
"type": "string", "label": "status",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 51,
"labelHeight": 26
},
"type": {
"label": "string",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 48,
"labelHeight": 26
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
} }
@ -285,19 +637,19 @@
"labelPercentage": 0, "labelPercentage": 0,
"route": [ "route": [
{ {
"x": 764.5, "x": 564,
"y": 228 "y": 228
}, },
{ {
"x": 764.5, "x": 564,
"y": 278 "y": 278
}, },
{ {
"x": 523.75, "x": 399,
"y": 278 "y": 278
}, },
{ {
"x": 523.75, "x": 399,
"y": 328 "y": 328
} }
], ],
@ -332,11 +684,11 @@
"labelPercentage": 0, "labelPercentage": 0,
"route": [ "route": [
{ {
"x": 470, "x": 358,
"y": 228 "y": 228
}, },
{ {
"x": 470, "x": 358,
"y": 328 "y": 328
} }
], ],
@ -371,19 +723,19 @@
"labelPercentage": 0, "labelPercentage": 0,
"route": [ "route": [
{ {
"x": 158.5, "x": 134,
"y": 228 "y": 228
}, },
{ {
"x": 158.5, "x": 134,
"y": 278 "y": 278
}, },
{ {
"x": 416.25, "x": 317,
"y": 278 "y": 278
}, },
{ {
"x": 416.25, "x": 317,
"y": 328 "y": 328
} }
], ],

View file

@ -2,7 +2,7 @@
<svg <svg
style="background: white;" style="background: white;"
xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
width="1082" height="660" viewBox="-88 -88 1082 660"><style type="text/css"> width="856" height="660" viewBox="-88 -88 856 660"><style type="text/css">
<![CDATA[ <![CDATA[
.shape { .shape {
shape-rendering: geometricPrecision; shape-rendering: geometricPrecision;
@ -18,40 +18,40 @@ width="1082" height="660" viewBox="-88 -88 1082 660"><style type="text/css">
} }
]]> ]]>
</style><g id="users"><g class="shape" ><rect class="shape" x="635" y="12" width="259" height="216" style="fill:#FFFFFF;stroke:#0A0F25;opacity:1.000000;stroke-width:2;"/><rect class="class_header" x="635.000000" y="12.000000" width="259.000000" height="36.000000" fill="#0a0f25" /><text class="text" x="655.000000" y="39.000000" style="text-anchor:start;font-size:24px;fill:white">users</text><text class="text" x="645.000000" y="71.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">id</text> </style><g id="users"><g class="shape" ><rect class="shape" x="460" y="12" width="208" height="216" style="fill:#FFFFFF;stroke:#0A0F25;opacity:1.000000;stroke-width:2;"/><rect class="class_header" x="460.000000" y="12.000000" width="208.000000" height="36.000000" fill="#0a0f25" /><text class="text" x="480.000000" y="39.000000" style="text-anchor:start;font-size:24px;fill:white">users</text><text class="text" x="470.000000" y="71.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">id</text>
<text class="text" x="756.111111" y="71.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text> <text class="text" x="571.000000" y="71.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text>
<text class="text" x="874.000000" y="71.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="635.000000" y1="84.000000" x2="894.000000" y2="84.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="645.000000" y="107.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">name</text> <text class="text" x="648.000000" y="71.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="460.000000" y1="84.000000" x2="668.000000" y2="84.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="470.000000" y="107.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">name</text>
<text class="text" x="756.111111" y="107.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text> <text class="text" x="571.000000" y="107.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text>
<text class="text" x="874.000000" y="107.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="635.000000" y1="120.000000" x2="894.000000" y2="120.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="645.000000" y="143.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">email</text> <text class="text" x="648.000000" y="107.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="460.000000" y1="120.000000" x2="668.000000" y2="120.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="470.000000" y="143.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">email</text>
<text class="text" x="756.111111" y="143.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text> <text class="text" x="571.000000" y="143.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text>
<text class="text" x="874.000000" y="143.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="635.000000" y1="156.000000" x2="894.000000" y2="156.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="645.000000" y="179.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">password</text> <text class="text" x="648.000000" y="143.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="460.000000" y1="156.000000" x2="668.000000" y2="156.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="470.000000" y="179.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">password</text>
<text class="text" x="756.111111" y="179.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text> <text class="text" x="571.000000" y="179.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text>
<text class="text" x="874.000000" y="179.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="635.000000" y1="192.000000" x2="894.000000" y2="192.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="645.000000" y="215.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">last_login</text> <text class="text" x="648.000000" y="179.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="460.000000" y1="192.000000" x2="668.000000" y2="192.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="470.000000" y="215.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">last_login</text>
<text class="text" x="756.111111" y="215.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">datetime</text> <text class="text" x="571.000000" y="215.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">datetime</text>
<text class="text" x="874.000000" y="215.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="635.000000" y1="228.000000" x2="894.000000" y2="228.000000" style="stroke-width:2;stroke:#0a0f25" /></g></g><g id="products"><g class="shape" ><rect class="shape" x="325" y="48" width="290" height="180" style="fill:#FFFFFF;stroke:#0A0F25;opacity:1.000000;stroke-width:2;"/><rect class="class_header" x="325.000000" y="48.000000" width="290.000000" height="36.000000" fill="#0a0f25" /><text class="text" x="345.000000" y="75.000000" style="text-anchor:start;font-size:24px;fill:white">products</text><text class="text" x="335.000000" y="107.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">id</text> <text class="text" x="648.000000" y="215.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="460.000000" y1="228.000000" x2="668.000000" y2="228.000000" style="stroke-width:2;stroke:#0a0f25" /></g></g><g id="products"><g class="shape" ><rect class="shape" x="276" y="48" width="164" height="180" style="fill:#FFFFFF;stroke:#0A0F25;opacity:1.000000;stroke-width:2;"/><rect class="class_header" x="276.000000" y="48.000000" width="164.000000" height="36.000000" fill="#0a0f25" /><text class="text" x="296.000000" y="75.000000" style="text-anchor:start;font-size:24px;fill:white">products</text><text class="text" x="286.000000" y="107.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">id</text>
<text class="text" x="390.555556" y="107.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text> <text class="text" x="353.000000" y="107.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text>
<text class="text" x="595.000000" y="107.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="325.000000" y1="120.000000" x2="615.000000" y2="120.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="335.000000" y="143.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">price</text> <text class="text" x="420.000000" y="107.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="276.000000" y1="120.000000" x2="440.000000" y2="120.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="286.000000" y="143.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">price</text>
<text class="text" x="390.555556" y="143.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">decimal</text> <text class="text" x="353.000000" y="143.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">decimal</text>
<text class="text" x="595.000000" y="143.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="325.000000" y1="156.000000" x2="615.000000" y2="156.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="335.000000" y="179.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">sku</text> <text class="text" x="420.000000" y="143.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="276.000000" y1="156.000000" x2="440.000000" y2="156.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="286.000000" y="179.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">sku</text>
<text class="text" x="390.555556" y="179.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text> <text class="text" x="353.000000" y="179.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text>
<text class="text" x="595.000000" y="179.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="325.000000" y1="192.000000" x2="615.000000" y2="192.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="335.000000" y="215.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">name</text> <text class="text" x="420.000000" y="179.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="276.000000" y1="192.000000" x2="440.000000" y2="192.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="286.000000" y="215.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">name</text>
<text class="text" x="390.555556" y="215.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text> <text class="text" x="353.000000" y="215.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text>
<text class="text" x="595.000000" y="215.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="325.000000" y1="228.000000" x2="615.000000" y2="228.000000" style="stroke-width:2;stroke:#0a0f25" /></g></g><g id="orders"><g class="shape" ><rect class="shape" x="363" y="328" width="215" height="144" style="fill:#FFFFFF;stroke:#0A0F25;opacity:1.000000;stroke-width:2;"/><rect class="class_header" x="363.000000" y="328.000000" width="215.000000" height="36.000000" fill="#0a0f25" /><text class="text" x="383.000000" y="355.000000" style="text-anchor:start;font-size:24px;fill:white">orders</text><text class="text" x="373.000000" y="387.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">id</text> <text class="text" x="420.000000" y="215.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="276.000000" y1="228.000000" x2="440.000000" y2="228.000000" style="stroke-width:2;stroke:#0a0f25" /></g></g><g id="orders"><g class="shape" ><rect class="shape" x="276" y="328" width="164" height="144" style="fill:#FFFFFF;stroke:#0A0F25;opacity:1.000000;stroke-width:2;"/><rect class="class_header" x="276.000000" y="328.000000" width="164.000000" height="36.000000" fill="#0a0f25" /><text class="text" x="296.000000" y="355.000000" style="text-anchor:start;font-size:24px;fill:white">orders</text><text class="text" x="286.000000" y="387.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">id</text>
<text class="text" x="484.111111" y="387.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text> <text class="text" x="397.000000" y="387.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text>
<text class="text" x="558.000000" y="387.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="363.000000" y1="400.000000" x2="578.000000" y2="400.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="373.000000" y="423.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">user_id</text> <text class="text" x="420.000000" y="387.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="276.000000" y1="400.000000" x2="440.000000" y2="400.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="286.000000" y="423.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">user_id</text>
<text class="text" x="484.111111" y="423.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text> <text class="text" x="397.000000" y="423.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text>
<text class="text" x="558.000000" y="423.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="363.000000" y1="436.000000" x2="578.000000" y2="436.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="373.000000" y="459.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">product_id</text> <text class="text" x="420.000000" y="423.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="276.000000" y1="436.000000" x2="440.000000" y2="436.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="286.000000" y="459.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">product_id</text>
<text class="text" x="484.111111" y="459.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text> <text class="text" x="397.000000" y="459.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text>
<text class="text" x="558.000000" y="459.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="363.000000" y1="472.000000" x2="578.000000" y2="472.000000" style="stroke-width:2;stroke:#0a0f25" /></g></g><g id="shipments"><g class="shape" ><rect class="shape" x="12" y="48" width="293" height="180" style="fill:#FFFFFF;stroke:#0A0F25;opacity:1.000000;stroke-width:2;"/><rect class="class_header" x="12.000000" y="48.000000" width="293.000000" height="36.000000" fill="#0a0f25" /><text class="text" x="32.000000" y="75.000000" style="text-anchor:start;font-size:24px;fill:white">shipments</text><text class="text" x="22.000000" y="107.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">id</text> <text class="text" x="420.000000" y="459.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="276.000000" y1="472.000000" x2="440.000000" y2="472.000000" style="stroke-width:2;stroke:#0a0f25" /></g></g><g id="shipments"><g class="shape" ><rect class="shape" x="12" y="48" width="244" height="180" style="fill:#FFFFFF;stroke:#0A0F25;opacity:1.000000;stroke-width:2;"/><rect class="class_header" x="12.000000" y="48.000000" width="244.000000" height="36.000000" fill="#0a0f25" /><text class="text" x="32.000000" y="75.000000" style="text-anchor:start;font-size:24px;fill:white">shipments</text><text class="text" x="22.000000" y="107.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">id</text>
<text class="text" x="188.666667" y="107.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text> <text class="text" x="188.000000" y="107.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text>
<text class="text" x="285.000000" y="107.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="12.000000" y1="120.000000" x2="305.000000" y2="120.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="22.000000" y="143.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">order_id</text> <text class="text" x="236.000000" y="107.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="12.000000" y1="120.000000" x2="256.000000" y2="120.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="22.000000" y="143.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">order_id</text>
<text class="text" x="188.666667" y="143.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text> <text class="text" x="188.000000" y="143.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">int</text>
<text class="text" x="285.000000" y="143.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="12.000000" y1="156.000000" x2="305.000000" y2="156.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="22.000000" y="179.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">tracking_number</text> <text class="text" x="236.000000" y="143.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="12.000000" y1="156.000000" x2="256.000000" y2="156.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="22.000000" y="179.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">tracking_number</text>
<text class="text" x="188.666667" y="179.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text> <text class="text" x="188.000000" y="179.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text>
<text class="text" x="285.000000" y="179.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="12.000000" y1="192.000000" x2="305.000000" y2="192.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="22.000000" y="215.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">status</text> <text class="text" x="236.000000" y="179.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="12.000000" y1="192.000000" x2="256.000000" y2="192.000000" style="stroke-width:2;stroke:#0a0f25" /><text class="text" x="22.000000" y="215.000000" style="text-anchor:start;font-size:20px;fill:rgb(13, 50, 178)">status</text>
<text class="text" x="188.666667" y="215.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text> <text class="text" x="188.000000" y="215.000000" style="text-anchor:start;font-size:20px;fill:rgb(103, 108, 126)">string</text>
<text class="text" x="285.000000" y="215.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="12.000000" y1="228.000000" x2="305.000000" y2="228.000000" style="stroke-width:2;stroke:#0a0f25" /></g></g><g id="(users &lt;-&gt; orders)[0]"><marker id="mk-2510427236" markerWidth="10.000000" markerHeight="12.000000" refX="3.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon class="connection" fill="#0D32B2" stroke-width="2" points="10.000000,0.000000 0.000000,6.000000 10.000000,12.000000" /> </marker><marker id="mk-3990223579" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon class="connection" fill="#0D32B2" stroke-width="2" points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" /> </marker><path d="M 764.500000 232.000000 L 764.500000 268.000000 S 764.500000 278.000000 754.500000 278.000000 L 533.750000 278.000000 S 523.750000 278.000000 523.750000 288.000000 L 523.750000 324.000000" class="connection" style="fill:none;stroke:#0D32B2;opacity:1.000000;stroke-width:2;" marker-start="url(#mk-2510427236)" marker-end="url(#mk-3990223579)" mask="url(#823833100)"/></g><g id="(products &lt;-&gt; orders)[0]"><path d="M 470.000000 232.000000 L 470.000000 324.000000" class="connection" style="fill:none;stroke:#0D32B2;opacity:1.000000;stroke-width:2;" marker-start="url(#mk-2510427236)" marker-end="url(#mk-3990223579)" mask="url(#823833100)"/></g><g id="(shipments &lt;-&gt; orders)[0]"><path d="M 158.500000 232.000000 L 158.500000 268.000000 S 158.500000 278.000000 168.500000 278.000000 L 406.250000 278.000000 S 416.250000 278.000000 416.250000 288.000000 L 416.250000 324.000000" class="connection" style="fill:none;stroke:#0D32B2;opacity:1.000000;stroke-width:2;" marker-start="url(#mk-2510427236)" marker-end="url(#mk-3990223579)" mask="url(#823833100)"/></g><mask id="823833100" maskUnits="userSpaceOnUse" x="0" y="0" width="1082" height="660"> <text class="text" x="236.000000" y="215.000000" style="text-anchor:end;font-size:20px;fill:rgb(74, 111, 243);letter-spacing:2px;"></text><line x1="12.000000" y1="228.000000" x2="256.000000" y2="228.000000" style="stroke-width:2;stroke:#0a0f25" /></g></g><g id="(users &lt;-&gt; orders)[0]"><marker id="mk-2510427236" markerWidth="10.000000" markerHeight="12.000000" refX="3.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon class="connection" fill="#0D32B2" stroke-width="2" points="10.000000,0.000000 0.000000,6.000000 10.000000,12.000000" /> </marker><marker id="mk-3990223579" markerWidth="10.000000" markerHeight="12.000000" refX="7.000000" refY="6.000000" viewBox="0.000000 0.000000 10.000000 12.000000" orient="auto" markerUnits="userSpaceOnUse"> <polygon class="connection" fill="#0D32B2" stroke-width="2" points="0.000000,0.000000 10.000000,6.000000 0.000000,12.000000" /> </marker><path d="M 564.000000 232.000000 L 564.000000 268.000000 S 564.000000 278.000000 554.000000 278.000000 L 409.000000 278.000000 S 399.000000 278.000000 399.000000 288.000000 L 399.000000 324.000000" class="connection" style="fill:none;stroke:#0D32B2;opacity:1.000000;stroke-width:2;" marker-start="url(#mk-2510427236)" marker-end="url(#mk-3990223579)" mask="url(#2570056002)"/></g><g id="(products &lt;-&gt; orders)[0]"><path d="M 358.000000 232.000000 L 358.000000 324.000000" class="connection" style="fill:none;stroke:#0D32B2;opacity:1.000000;stroke-width:2;" marker-start="url(#mk-2510427236)" marker-end="url(#mk-3990223579)" mask="url(#2570056002)"/></g><g id="(shipments &lt;-&gt; orders)[0]"><path d="M 134.000000 232.000000 L 134.000000 268.000000 S 134.000000 278.000000 144.000000 278.000000 L 307.000000 278.000000 S 317.000000 278.000000 317.000000 288.000000 L 317.000000 324.000000" class="connection" style="fill:none;stroke:#0D32B2;opacity:1.000000;stroke-width:2;" marker-start="url(#mk-2510427236)" marker-end="url(#mk-3990223579)" mask="url(#2570056002)"/></g><mask id="2570056002" maskUnits="userSpaceOnUse" x="0" y="0" width="856" height="660">
<rect x="0" y="0" width="1082" height="660" fill="white"></rect> <rect x="0" y="0" width="856" height="660" fill="white"></rect>
</mask><style type="text/css"><![CDATA[ </mask><style type="text/css"><![CDATA[
.text { .text {

Before

Width:  |  Height:  |  Size: 336 KiB

After

Width:  |  Height:  |  Size: 336 KiB

View file

@ -450,14 +450,58 @@
"sql_table": { "sql_table": {
"columns": [ "columns": [
{ {
"name": "id", "name": {
"type": "int", "label": "id",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"type": {
"label": "int",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
}, },
{ {
"name": "dst_id", "name": {
"type": "int", "label": "dst_id",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"type": {
"label": "int",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
} }
@ -541,14 +585,58 @@
"sql_table": { "sql_table": {
"columns": [ "columns": [
{ {
"name": "id", "name": {
"type": "int", "label": "id",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"type": {
"label": "int",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"constraint": "", "constraint": "",
"reference": "src.dst_id" "reference": "src.dst_id"
}, },
{ {
"name": "name", "name": {
"type": "string", "label": "name",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"type": {
"label": "string",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
} }

View file

@ -198,8 +198,30 @@
"sql_table": { "sql_table": {
"columns": [ "columns": [
{ {
"name": "x", "name": {
"type": "", "label": "x",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"type": {
"label": "",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
} }

View file

@ -262,14 +262,58 @@
"sql_table": { "sql_table": {
"columns": [ "columns": [
{ {
"name": "GetType()", "name": {
"type": "string", "label": "GetType()",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"type": {
"label": "string",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
}, },
{ {
"name": "Is()", "name": {
"type": "bool", "label": "Is()",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"type": {
"label": "bool",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
} }

View file

@ -199,14 +199,58 @@
"sql_table": { "sql_table": {
"columns": [ "columns": [
{ {
"name": "GetType()", "name": {
"type": "string", "label": "GetType()",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"type": {
"label": "string",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
}, },
{ {
"name": "Is()", "name": {
"type": "bool", "label": "Is()",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"type": {
"label": "bool",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
} }

View file

@ -196,8 +196,30 @@
"sql_table": { "sql_table": {
"columns": [ "columns": [
{ {
"name": "GetType()", "name": {
"type": "string", "label": "GetType()",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"type": {
"label": "string",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
} }

View file

@ -247,8 +247,30 @@
"sql_table": { "sql_table": {
"columns": [ "columns": [
{ {
"name": "GetType()", "name": {
"type": "string", "label": "GetType()",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"type": {
"label": "string",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"constraint": "", "constraint": "",
"reference": "" "reference": ""
} }

View file

@ -431,8 +431,30 @@
"sql_table": { "sql_table": {
"columns": [ "columns": [
{ {
"name": "id", "name": {
"type": "int", "label": "id",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"type": {
"label": "int",
"fontSize": 0,
"fontFamily": "",
"language": "",
"color": "",
"italic": false,
"bold": false,
"underline": false,
"labelWidth": 0,
"labelHeight": 0
},
"constraint": "primary_key", "constraint": "primary_key",
"reference": "" "reference": ""
} }