Files
Satya K 3b2c4fb913 Add Draw.io Diagram Generator skill and instructions (#1179)
* Add draw-io diagram generator skill for awesome github copilot

* Add comprehensive shape libraries and style reference documentation for draw.io

- Introduced a new markdown file for draw.io shape libraries detailing various built-in shapes, their style keys, and usage.
- Added a complete style reference for `<mxCell>` elements, including universal style keys, shape-specific keys, edge styles, and color palettes.
- Included examples for common styles and shapes to aid users in creating diagrams effectively.

* Add draw-io diagram validation and shape addition scripts

* Add new diagram templates for flowchart, sequence, and UML class diagrams

- Created a flowchart template with a structured layout including start, steps, decision points, and end.
- Added a sequence diagram template illustrating interactions between a client, API server, and database with activation boxes and message arrows.
- Introduced a UML class diagram template featuring an interface, classes, attributes, methods, and relationships, including composition and realization.

* Add draw-io diagram generator skill to README with detailed usage instructions and bundled assets

* Add draw.io instructions with workflow, XML structure rules, style conventions, and validation checklist

* Add draw.io diagram standards to README instructions for enhanced diagram creation and editing

* Moving diagram templates to assets/ to follow agentskills structure

- Moved flowchart template with start, steps, decision points, and end nodes.
- Moved sequence diagram template illustrating interactions between a client, API server, and database.
- Moved UML class diagram template featuring an interface, classes, attributes, methods, and relationships.

* Clarify installation instructions for draw.io VS Code extension in SKILL.md
2026-03-27 11:15:53 +11:00

376 lines
26 KiB
Plaintext

<mxfile host="Electron" modified="2026-03-25T00:00:00.000Z" version="26.0.0">
<diagram id="er-diagram" name="ER Diagram">
<mxGraphModel dx="1422" dy="762" grid="1" gridSize="10" guides="1"
tooltips="1" connect="1" arrows="1" fold="1"
page="1" pageScale="1" pageWidth="1169" pageHeight="827"
math="0" shadow="0">
<root>
<mxCell id="0" />
<mxCell id="1" parent="0" />
<!-- TITLE -->
<mxCell id="2" value="Entity Relationship Diagram"
style="text;html=1;strokeColor=none;fillColor=none;align=center;verticalAlign=middle;whiteSpace=wrap;rounded=0;fontSize=18;fontStyle=1;"
vertex="1" parent="1">
<mxGeometry x="300" y="20" width="570" height="40" as="geometry" />
</mxCell>
<!-- ====== TABLE: users ====== -->
<!-- Table container -->
<mxCell id="tbl_users" value="users"
style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;fillColor=#dae8fc;strokeColor=#6c8ebf;fontSize=13;"
vertex="1" parent="1">
<mxGeometry x="80" y="120" width="260" height="210" as="geometry" />
</mxCell>
<!-- Header row (already part of container via startSize, add column headers) -->
<mxCell id="tbl_users_r0" value=""
style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontSize=12;top=0;left=0;right=0;bottom=1;"
vertex="1" parent="tbl_users">
<mxGeometry y="30" width="260" height="30" as="geometry" />
</mxCell>
<mxCell id="tbl_users_r0_c1" value="PK"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;"
vertex="1" parent="tbl_users_r0">
<mxGeometry width="50" height="30" as="geometry"><mxRectangle width="50" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="tbl_users_r0_c2" value="id (UUID)"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_users_r0">
<mxGeometry x="50" width="140" height="30" as="geometry"><mxRectangle width="140" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="tbl_users_r0_c3" value="NOT NULL"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;fontStyle=2;"
vertex="1" parent="tbl_users_r0">
<mxGeometry x="190" width="70" height="30" as="geometry"><mxRectangle width="70" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="tbl_users_r1" value=""
style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontSize=12;top=0;left=0;right=0;bottom=0;"
vertex="1" parent="tbl_users">
<mxGeometry y="60" width="260" height="30" as="geometry" />
</mxCell>
<mxCell id="tbl_users_r1_c1" value=""
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_users_r1">
<mxGeometry width="50" height="30" as="geometry"><mxRectangle width="50" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="tbl_users_r1_c2" value="email (VARCHAR 255)"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_users_r1">
<mxGeometry x="50" width="140" height="30" as="geometry"><mxRectangle width="140" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="tbl_users_r1_c3" value="UNIQUE"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;fontStyle=2;"
vertex="1" parent="tbl_users_r1">
<mxGeometry x="190" width="70" height="30" as="geometry"><mxRectangle width="70" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="tbl_users_r2" value=""
style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontSize=12;top=0;left=0;right=0;bottom=0;"
vertex="1" parent="tbl_users">
<mxGeometry y="90" width="260" height="30" as="geometry" />
</mxCell>
<mxCell id="tbl_users_r2_c1" value=""
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_users_r2">
<mxGeometry width="50" height="30" as="geometry"><mxRectangle width="50" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="tbl_users_r2_c2" value="name (VARCHAR 100)"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_users_r2">
<mxGeometry x="50" width="140" height="30" as="geometry"><mxRectangle width="140" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="tbl_users_r2_c3" value="NOT NULL"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;fontStyle=2;"
vertex="1" parent="tbl_users_r2">
<mxGeometry x="190" width="70" height="30" as="geometry"><mxRectangle width="70" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="tbl_users_r3" value=""
style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontSize=12;top=0;left=0;right=0;bottom=0;"
vertex="1" parent="tbl_users">
<mxGeometry y="120" width="260" height="30" as="geometry" />
</mxCell>
<mxCell id="tbl_users_r3_c1" value=""
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_users_r3">
<mxGeometry width="50" height="30" as="geometry"><mxRectangle width="50" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="tbl_users_r3_c2" value="created_at (TIMESTAMP)"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_users_r3">
<mxGeometry x="50" width="140" height="30" as="geometry"><mxRectangle width="140" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="tbl_users_r3_c3" value="DEFAULT NOW()"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;fontStyle=2;"
vertex="1" parent="tbl_users_r3">
<mxGeometry x="190" width="70" height="30" as="geometry"><mxRectangle width="70" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="tbl_users_r4" value=""
style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontSize=12;top=0;left=0;right=0;bottom=0;"
vertex="1" parent="tbl_users">
<mxGeometry y="150" width="260" height="30" as="geometry" />
</mxCell>
<mxCell id="tbl_users_r4_c1" value=""
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_users_r4">
<mxGeometry width="50" height="30" as="geometry"><mxRectangle width="50" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="tbl_users_r4_c2" value="updated_at (TIMESTAMP)"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_users_r4">
<mxGeometry x="50" width="140" height="30" as="geometry"><mxRectangle width="140" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="tbl_users_r4_c3" value=""
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_users_r4">
<mxGeometry x="190" width="70" height="30" as="geometry"><mxRectangle width="70" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<!-- ====== TABLE: orders ====== -->
<mxCell id="tbl_orders" value="orders"
style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;fillColor=#fff2cc;strokeColor=#d6b656;fontSize=13;"
vertex="1" parent="1">
<mxGeometry x="460" y="120" width="260" height="240" as="geometry" />
</mxCell>
<mxCell id="tbl_orders_r0" value=""
style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontSize=12;top=0;left=0;right=0;bottom=1;"
vertex="1" parent="tbl_orders">
<mxGeometry y="30" width="260" height="30" as="geometry" />
</mxCell>
<mxCell id="t2r0c1" value="PK"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;"
vertex="1" parent="tbl_orders_r0">
<mxGeometry width="50" height="30" as="geometry"><mxRectangle width="50" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="t2r0c2" value="id (UUID)"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_orders_r0">
<mxGeometry x="50" width="140" height="30" as="geometry"><mxRectangle width="140" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="t2r0c3" value="NOT NULL"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;fontStyle=2;"
vertex="1" parent="tbl_orders_r0">
<mxGeometry x="190" width="70" height="30" as="geometry"><mxRectangle width="70" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="tbl_orders_r1" value=""
style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontSize=12;top=0;left=0;right=0;bottom=0;"
vertex="1" parent="tbl_orders">
<mxGeometry y="60" width="260" height="30" as="geometry" />
</mxCell>
<mxCell id="t2r1c1" value="FK"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=2;overflow=hidden;"
vertex="1" parent="tbl_orders_r1">
<mxGeometry width="50" height="30" as="geometry"><mxRectangle width="50" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="t2r1c2" value="user_id (UUID)"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_orders_r1">
<mxGeometry x="50" width="140" height="30" as="geometry"><mxRectangle width="140" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="t2r1c3" value="NOT NULL"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;fontStyle=2;"
vertex="1" parent="tbl_orders_r1">
<mxGeometry x="190" width="70" height="30" as="geometry"><mxRectangle width="70" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="tbl_orders_r2" value=""
style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontSize=12;top=0;left=0;right=0;bottom=0;"
vertex="1" parent="tbl_orders">
<mxGeometry y="90" width="260" height="30" as="geometry" />
</mxCell>
<mxCell id="t2r2c1" value=""
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_orders_r2">
<mxGeometry width="50" height="30" as="geometry"><mxRectangle width="50" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="t2r2c2" value="status (VARCHAR 20)"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_orders_r2">
<mxGeometry x="50" width="140" height="30" as="geometry"><mxRectangle width="140" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="t2r2c3" value="DEFAULT 'pending'"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;fontStyle=2;"
vertex="1" parent="tbl_orders_r2">
<mxGeometry x="190" width="70" height="30" as="geometry"><mxRectangle width="70" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="tbl_orders_r3" value=""
style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontSize=12;top=0;left=0;right=0;bottom=0;"
vertex="1" parent="tbl_orders">
<mxGeometry y="120" width="260" height="30" as="geometry" />
</mxCell>
<mxCell id="t2r3c1" value=""
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_orders_r3">
<mxGeometry width="50" height="30" as="geometry"><mxRectangle width="50" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="t2r3c2" value="total (DECIMAL 10,2)"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_orders_r3">
<mxGeometry x="50" width="140" height="30" as="geometry"><mxRectangle width="140" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="t2r3c3" value=""
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_orders_r3">
<mxGeometry x="190" width="70" height="30" as="geometry"><mxRectangle width="70" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="tbl_orders_r4" value=""
style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontSize=12;top=0;left=0;right=0;bottom=0;"
vertex="1" parent="tbl_orders">
<mxGeometry y="150" width="260" height="30" as="geometry" />
</mxCell>
<mxCell id="t2r4c1" value=""
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_orders_r4">
<mxGeometry width="50" height="30" as="geometry"><mxRectangle width="50" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="t2r4c2" value="created_at (TIMESTAMP)"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_orders_r4">
<mxGeometry x="50" width="140" height="30" as="geometry"><mxRectangle width="140" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="t2r4c3" value="DEFAULT NOW()"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;fontStyle=2;"
vertex="1" parent="tbl_orders_r4">
<mxGeometry x="190" width="70" height="30" as="geometry"><mxRectangle width="70" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<!-- ====== TABLE: order_items ====== -->
<mxCell id="tbl_items" value="order_items"
style="shape=table;startSize=30;container=1;collapsible=1;childLayout=tableLayout;fixedRows=1;rowLines=0;fontStyle=1;align=center;resizeLast=1;fillColor=#d5e8d4;strokeColor=#82b366;fontSize=13;"
vertex="1" parent="1">
<mxGeometry x="460" y="430" width="260" height="240" as="geometry" />
</mxCell>
<mxCell id="tbl_items_r0" value=""
style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontSize=12;top=0;left=0;right=0;bottom=1;"
vertex="1" parent="tbl_items">
<mxGeometry y="30" width="260" height="30" as="geometry" />
</mxCell>
<mxCell id="t3r0c1" value="PK"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=1;overflow=hidden;"
vertex="1" parent="tbl_items_r0">
<mxGeometry width="50" height="30" as="geometry"><mxRectangle width="50" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="t3r0c2" value="id (UUID)"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_items_r0">
<mxGeometry x="50" width="140" height="30" as="geometry"><mxRectangle width="140" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="t3r0c3" value="NOT NULL"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;fontStyle=2;"
vertex="1" parent="tbl_items_r0">
<mxGeometry x="190" width="70" height="30" as="geometry"><mxRectangle width="70" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="tbl_items_r1" value=""
style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontSize=12;top=0;left=0;right=0;bottom=0;"
vertex="1" parent="tbl_items">
<mxGeometry y="60" width="260" height="30" as="geometry" />
</mxCell>
<mxCell id="t3r1c1" value="FK"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;fontStyle=2;overflow=hidden;"
vertex="1" parent="tbl_items_r1">
<mxGeometry width="50" height="30" as="geometry"><mxRectangle width="50" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="t3r1c2" value="order_id (UUID)"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_items_r1">
<mxGeometry x="50" width="140" height="30" as="geometry"><mxRectangle width="140" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="t3r1c3" value="NOT NULL"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;fontStyle=2;"
vertex="1" parent="tbl_items_r1">
<mxGeometry x="190" width="70" height="30" as="geometry"><mxRectangle width="70" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="tbl_items_r2" value=""
style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontSize=12;top=0;left=0;right=0;bottom=0;"
vertex="1" parent="tbl_items">
<mxGeometry y="90" width="260" height="30" as="geometry" />
</mxCell>
<mxCell id="t3r2c1" value=""
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_items_r2">
<mxGeometry width="50" height="30" as="geometry"><mxRectangle width="50" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="t3r2c2" value="product_name (VARCHAR)"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_items_r2">
<mxGeometry x="50" width="140" height="30" as="geometry"><mxRectangle width="140" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="t3r2c3" value="NOT NULL"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;fontStyle=2;"
vertex="1" parent="tbl_items_r2">
<mxGeometry x="190" width="70" height="30" as="geometry"><mxRectangle width="70" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="tbl_items_r3" value=""
style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontSize=12;top=0;left=0;right=0;bottom=0;"
vertex="1" parent="tbl_items">
<mxGeometry y="120" width="260" height="30" as="geometry" />
</mxCell>
<mxCell id="t3r3c1" value=""
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_items_r3">
<mxGeometry width="50" height="30" as="geometry"><mxRectangle width="50" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="t3r3c2" value="quantity (INT)"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_items_r3">
<mxGeometry x="50" width="140" height="30" as="geometry"><mxRectangle width="140" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="t3r3c3" value="CHECK (&gt; 0)"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;fontStyle=2;"
vertex="1" parent="tbl_items_r3">
<mxGeometry x="190" width="70" height="30" as="geometry"><mxRectangle width="70" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="tbl_items_r4" value=""
style="shape=tableRow;horizontal=0;startSize=0;swimlaneHead=0;swimlaneBody=0;fillColor=none;collapsible=0;dropTarget=0;points=[[0,0.5],[1,0.5]];portConstraint=eastwest;fontSize=12;top=0;left=0;right=0;bottom=0;"
vertex="1" parent="tbl_items">
<mxGeometry y="150" width="260" height="30" as="geometry" />
</mxCell>
<mxCell id="t3r4c1" value=""
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_items_r4">
<mxGeometry width="50" height="30" as="geometry"><mxRectangle width="50" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="t3r4c2" value="unit_price (DECIMAL 10,2)"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;"
vertex="1" parent="tbl_items_r4">
<mxGeometry x="50" width="140" height="30" as="geometry"><mxRectangle width="140" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<mxCell id="t3r4c3" value="NOT NULL"
style="shape=partialRectangle;connectable=0;fillColor=none;top=0;left=0;bottom=0;right=0;overflow=hidden;fontStyle=2;"
vertex="1" parent="tbl_items_r4">
<mxGeometry x="190" width="70" height="30" as="geometry"><mxRectangle width="70" height="30" as="alternateBounds" /></mxGeometry>
</mxCell>
<!-- ====== RELATIONSHIPS ====== -->
<!-- users 1 → orders (one-to-many): ERone on users side, ERmanyToOne on orders side -->
<mxCell id="rel1" value=""
style="edgeStyle=entityRelationEdgeStyle;html=1;endArrow=ERmany;startArrow=ERone;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;"
edge="1" source="tbl_users_r1" target="tbl_orders_r1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
<!-- orders 1 → order_items (one-to-many) -->
<mxCell id="rel2" value=""
style="edgeStyle=entityRelationEdgeStyle;html=1;endArrow=ERmany;startArrow=ERone;exitX=0.5;exitY=1;exitDx=0;exitDy=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;"
edge="1" source="tbl_orders_r0" target="tbl_items_r1" parent="1">
<mxGeometry relative="1" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>