sirena 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.github/workflows/build_deploy.yml +59 -0
- data/.github/workflows/links.yml +85 -0
- data/.github/workflows/rake.yml +15 -0
- data/.github/workflows/release.yml +27 -0
- data/.gitignore +68 -0
- data/.rspec +3 -0
- data/.rubocop.yml +14 -0
- data/.rubocop_todo.yml +70 -0
- data/ARCHITECTURE.md +744 -0
- data/Gemfile +12 -0
- data/LICENSE +25 -0
- data/README.adoc +357 -0
- data/Rakefile +11 -0
- data/docs/.gitignore +1 -0
- data/docs/Gemfile +13 -0
- data/docs/_config.yml +182 -0
- data/docs/_diagram_types/architecture-diagram.adoc +314 -0
- data/docs/_diagram_types/block-diagram.adoc +345 -0
- data/docs/_diagram_types/c4-diagram.adoc +559 -0
- data/docs/_diagram_types/class-diagram.adoc +816 -0
- data/docs/_diagram_types/er-diagram.adoc +719 -0
- data/docs/_diagram_types/error-diagram.adoc +114 -0
- data/docs/_diagram_types/examples/flowchart-examples.adoc +29 -0
- data/docs/_diagram_types/flowchart.adoc +488 -0
- data/docs/_diagram_types/gantt-chart.adoc +502 -0
- data/docs/_diagram_types/git-graph.adoc +600 -0
- data/docs/_diagram_types/index.adoc +192 -0
- data/docs/_diagram_types/info-diagram.adoc +103 -0
- data/docs/_diagram_types/kanban-diagram.adoc +262 -0
- data/docs/_diagram_types/mindmap.adoc +603 -0
- data/docs/_diagram_types/packet-diagram.adoc +378 -0
- data/docs/_diagram_types/pie-chart.adoc +335 -0
- data/docs/_diagram_types/quadrant-chart.adoc +406 -0
- data/docs/_diagram_types/radar-chart.adoc +528 -0
- data/docs/_diagram_types/requirement-diagram.adoc +416 -0
- data/docs/_diagram_types/sankey-diagram.adoc +357 -0
- data/docs/_diagram_types/sequence-diagram.adoc +664 -0
- data/docs/_diagram_types/state-diagram.adoc +658 -0
- data/docs/_diagram_types/timeline.adoc +352 -0
- data/docs/_diagram_types/treemap-diagram.adoc +462 -0
- data/docs/_diagram_types/user-journey.adoc +602 -0
- data/docs/_features/index.adoc +129 -0
- data/docs/_guides/cli-reference.adoc +203 -0
- data/docs/_guides/index.adoc +56 -0
- data/docs/_guides/installation.adoc +100 -0
- data/docs/_guides/quick-start.adoc +132 -0
- data/docs/_pages/comparison.adoc +441 -0
- data/docs/_pages/compatibility.adoc +300 -0
- data/docs/_pages/index.adoc +39 -0
- data/docs/_references/index.adoc +103 -0
- data/docs/_tutorials/index.adoc +57 -0
- data/docs/index.adoc +166 -0
- data/docs/lychee.toml +54 -0
- data/examples/.gitignore +10 -0
- data/examples/README.adoc +196 -0
- data/examples/README.md +64 -0
- data/examples/architecture/01-basic-services.mmd +9 -0
- data/examples/architecture/01-basic-services.svg +37 -0
- data/examples/architecture/02-service-groups.mmd +16 -0
- data/examples/architecture/02-service-groups.svg +55 -0
- data/examples/architecture/README.adoc +79 -0
- data/examples/block/01-basic-blocks.mmd +13 -0
- data/examples/block/01-basic-blocks.svg +44 -0
- data/examples/block/02-block-shapes.mmd +13 -0
- data/examples/block/02-block-shapes.svg +47 -0
- data/examples/block/README.adoc +85 -0
- data/examples/c4/01-context-diagram.mmd +10 -0
- data/examples/c4/01-context-diagram.svg +45 -0
- data/examples/c4/02-container-diagram.mmd +24 -0
- data/examples/c4/02-container-diagram.svg +105 -0
- data/examples/c4/README.adoc +92 -0
- data/examples/class_diagram/01-basic-classes.mmd +61 -0
- data/examples/class_diagram/01-basic-classes.svg +117 -0
- data/examples/class_diagram/02-relationships.mmd +61 -0
- data/examples/class_diagram/02-relationships.svg +129 -0
- data/examples/class_diagram/README.adoc +93 -0
- data/examples/er_diagram/01-basic-entities.mmd +64 -0
- data/examples/er_diagram/01-basic-entities.svg +5 -0
- data/examples/er_diagram/02-cardinality.mmd +57 -0
- data/examples/er_diagram/02-cardinality.svg +125 -0
- data/examples/er_diagram/README.adoc +88 -0
- data/examples/error/01-basic-error.mmd +1 -0
- data/examples/error/01-basic-error.svg +13 -0
- data/examples/error/02-error-display.mmd +1 -0
- data/examples/error/02-error-display.svg +13 -0
- data/examples/error/README.adoc +71 -0
- data/examples/error_message_example.svg +13 -0
- data/examples/flowchart/00-original.mmd +13 -0
- data/examples/flowchart/00-original.svg +5 -0
- data/examples/flowchart/01-basic-flow.mmd +7 -0
- data/examples/flowchart/01-basic-flow.svg +52 -0
- data/examples/flowchart/01-basic-flow.yml +13 -0
- data/examples/flowchart/02*.svg +87 -0
- data/examples/flowchart/02-node-shapes.mmd +9 -0
- data/examples/flowchart/02-node-shapes.svg +33 -0
- data/examples/flowchart/03-edge-types.mmd +7 -0
- data/examples/flowchart/03-edge-types.svg +53 -0
- data/examples/flowchart/04-subgraphs.mmd +9 -0
- data/examples/flowchart/04-subgraphs.svg +33 -0
- data/examples/flowchart/05-styling.mmd +9 -0
- data/examples/flowchart/05-styling.svg +33 -0
- data/examples/flowchart/06-complex-flow.mmd +8 -0
- data/examples/flowchart/06-complex-flow.svg +59 -0
- data/examples/flowchart/README.adoc +167 -0
- data/examples/gantt/01-simple-timeline.* +14 -0
- data/examples/gantt/01-simple-timeline.mmd +6 -0
- data/examples/gantt/01-simple-timeline.svg +26 -0
- data/examples/gantt/02-task-dependencies.mmd +6 -0
- data/examples/gantt/02-task-dependencies.svg +26 -0
- data/examples/gantt/README.adoc +86 -0
- data/examples/git_graph/01-linear-history.mmd +12 -0
- data/examples/git_graph/01-linear-history.svg +26 -0
- data/examples/git_graph/02-branching.mmd +12 -0
- data/examples/git_graph/02-branching.svg +26 -0
- data/examples/git_graph/README.adoc +73 -0
- data/examples/info/02-showinfo.mmd +1 -0
- data/examples/info/02-showinfo.svg +10 -0
- data/examples/info/README.adoc +58 -0
- data/examples/info_showinfo_example.svg +10 -0
- data/examples/kanban/01-simple-board.mmd +8 -0
- data/examples/kanban/01-simple-board.svg +43 -0
- data/examples/kanban/02-workflow.mmd +8 -0
- data/examples/kanban/02-workflow.svg +43 -0
- data/examples/kanban/README.adoc +79 -0
- data/examples/mindmap/01-simple-tree.mmd +19 -0
- data/examples/mindmap/01-simple-tree.svg +61 -0
- data/examples/mindmap/02-knowledge-map.mmd +19 -0
- data/examples/mindmap/02-knowledge-map.svg +61 -0
- data/examples/mindmap/README.adoc +77 -0
- data/examples/packet/01-basic-packet.* +17 -0
- data/examples/packet/01-basic-packet.mmd +4 -0
- data/examples/packet/01-basic-packet.svg +82 -0
- data/examples/packet/README.adoc +58 -0
- data/examples/pie/01-simple-chart.mmd +5 -0
- data/examples/pie/01-simple-chart.svg +17 -0
- data/examples/pie/02-labeled-slices.mmd +6 -0
- data/examples/pie/02-labeled-slices.svg +19 -0
- data/examples/pie/README.adoc +75 -0
- data/examples/quadrant/01-basic-quadrant.mmd +13 -0
- data/examples/quadrant/01-basic-quadrant.svg +33 -0
- data/examples/quadrant/02-positioned-items.mmd +14 -0
- data/examples/quadrant/02-positioned-items.svg +35 -0
- data/examples/quadrant/README.adoc +84 -0
- data/examples/radar/01-simple-radar.* +5 -0
- data/examples/radar/01-simple-radar.mmd +3 -0
- data/examples/radar/01-simple-radar.svg +25 -0
- data/examples/radar/02-multiple-curves.mmd +4 -0
- data/examples/radar/02-multiple-curves.svg +43 -0
- data/examples/radar/README.adoc +75 -0
- data/examples/requirement/01-basic-requirements.mmd +23 -0
- data/examples/requirement/01-basic-requirements.svg +49 -0
- data/examples/requirement/02-risk-levels.mmd +23 -0
- data/examples/requirement/02-risk-levels.svg +49 -0
- data/examples/requirement/README.adoc +85 -0
- data/examples/sankey/01-simple-flow.mmd +7 -0
- data/examples/sankey/01-simple-flow.svg +34 -0
- data/examples/sankey/02-multi-stage.mmd +11 -0
- data/examples/sankey/02-multi-stage.svg +44 -0
- data/examples/sankey/README.adoc +74 -0
- data/examples/sequence/01-basic-sequence.mmd +27 -0
- data/examples/sequence/01-basic-sequence.svg +5 -0
- data/examples/sequence/02-activations.mmd +17 -0
- data/examples/sequence/02-activations.svg +78 -0
- data/examples/sequence/README.adoc +86 -0
- data/examples/state_diagram/01-simple-states.mmd +29 -0
- data/examples/state_diagram/01-simple-states.svg +5 -0
- data/examples/state_diagram/02-composite.mmd +19 -0
- data/examples/state_diagram/02-composite.svg +81 -0
- data/examples/state_diagram/README.adoc +90 -0
- data/examples/timeline/01-simple-timeline.mmd +11 -0
- data/examples/timeline/01-simple-timeline.svg +36 -0
- data/examples/timeline/02-periods.mmd +15 -0
- data/examples/timeline/02-periods.svg +47 -0
- data/examples/timeline/README.adoc +78 -0
- data/examples/treemap/01-basic-treemap.mmd +12 -0
- data/examples/treemap/01-basic-treemap.svg +59 -0
- data/examples/treemap/README.adoc +59 -0
- data/examples/user_journey/01-simple-journey.mmd +23 -0
- data/examples/user_journey/01-simple-journey.svg +5 -0
- data/examples/user_journey/02-multi-actor.mmd +18 -0
- data/examples/user_journey/02-multi-actor.svg +129 -0
- data/examples/user_journey/README.adoc +81 -0
- data/examples/xychart/01-line-chart.mmd +5 -0
- data/examples/xychart/01-line-chart.svg +43 -0
- data/examples/xychart/02-bar-chart.mmd +7 -0
- data/examples/xychart/02-bar-chart.svg +48 -0
- data/examples/xychart/README.adoc +80 -0
- data/exe/sirena +7 -0
- data/lib/sirena/cli.rb +138 -0
- data/lib/sirena/commands/batch.rb +117 -0
- data/lib/sirena/commands/render.rb +80 -0
- data/lib/sirena/commands/types.rb +29 -0
- data/lib/sirena/commands/version.rb +24 -0
- data/lib/sirena/diagram/architecture.rb +46 -0
- data/lib/sirena/diagram/base.rb +61 -0
- data/lib/sirena/diagram/block.rb +81 -0
- data/lib/sirena/diagram/c4.rb +328 -0
- data/lib/sirena/diagram/class_diagram.rb +385 -0
- data/lib/sirena/diagram/er_diagram.rb +238 -0
- data/lib/sirena/diagram/error.rb +38 -0
- data/lib/sirena/diagram/flowchart.rb +160 -0
- data/lib/sirena/diagram/gantt.rb +71 -0
- data/lib/sirena/diagram/git_graph.rb +36 -0
- data/lib/sirena/diagram/info.rb +38 -0
- data/lib/sirena/diagram/kanban.rb +178 -0
- data/lib/sirena/diagram/mindmap.rb +54 -0
- data/lib/sirena/diagram/packet.rb +79 -0
- data/lib/sirena/diagram/pie.rb +115 -0
- data/lib/sirena/diagram/quadrant.rb +138 -0
- data/lib/sirena/diagram/radar.rb +52 -0
- data/lib/sirena/diagram/requirement.rb +133 -0
- data/lib/sirena/diagram/sankey.rb +217 -0
- data/lib/sirena/diagram/sequence.rb +242 -0
- data/lib/sirena/diagram/state_diagram.rb +237 -0
- data/lib/sirena/diagram/timeline.rb +171 -0
- data/lib/sirena/diagram/treemap.rb +84 -0
- data/lib/sirena/diagram/user_journey.rb +149 -0
- data/lib/sirena/diagram/xy_chart.rb +76 -0
- data/lib/sirena/diagram.rb +8 -0
- data/lib/sirena/diagram_registry.rb +101 -0
- data/lib/sirena/engine.rb +292 -0
- data/lib/sirena/parser/architecture.rb +41 -0
- data/lib/sirena/parser/base.rb +41 -0
- data/lib/sirena/parser/block.rb +72 -0
- data/lib/sirena/parser/c4.rb +53 -0
- data/lib/sirena/parser/class_diagram.rb +63 -0
- data/lib/sirena/parser/er_diagram.rb +40 -0
- data/lib/sirena/parser/error.rb +49 -0
- data/lib/sirena/parser/flowchart.rb +71 -0
- data/lib/sirena/parser/gantt.rb +60 -0
- data/lib/sirena/parser/git_graph.rb +95 -0
- data/lib/sirena/parser/grammars/architecture.rb +145 -0
- data/lib/sirena/parser/grammars/block.rb +190 -0
- data/lib/sirena/parser/grammars/c4.rb +226 -0
- data/lib/sirena/parser/grammars/class_diagram.rb +284 -0
- data/lib/sirena/parser/grammars/common.rb +84 -0
- data/lib/sirena/parser/grammars/er_diagram.rb +114 -0
- data/lib/sirena/parser/grammars/error.rb +40 -0
- data/lib/sirena/parser/grammars/flowchart.rb +298 -0
- data/lib/sirena/parser/grammars/gantt.rb +252 -0
- data/lib/sirena/parser/grammars/git_graph.rb +167 -0
- data/lib/sirena/parser/grammars/info.rb +58 -0
- data/lib/sirena/parser/grammars/kanban.rb +83 -0
- data/lib/sirena/parser/grammars/mindmap.rb +115 -0
- data/lib/sirena/parser/grammars/packet.rb +73 -0
- data/lib/sirena/parser/grammars/pie.rb +128 -0
- data/lib/sirena/parser/grammars/quadrant.rb +199 -0
- data/lib/sirena/parser/grammars/radar.rb +150 -0
- data/lib/sirena/parser/grammars/requirement.rb +188 -0
- data/lib/sirena/parser/grammars/sankey.rb +104 -0
- data/lib/sirena/parser/grammars/sequence.rb +247 -0
- data/lib/sirena/parser/grammars/state_diagram.rb +172 -0
- data/lib/sirena/parser/grammars/timeline.rb +142 -0
- data/lib/sirena/parser/grammars/treemap.rb +120 -0
- data/lib/sirena/parser/grammars/xy_chart.rb +120 -0
- data/lib/sirena/parser/info.rb +49 -0
- data/lib/sirena/parser/kanban.rb +97 -0
- data/lib/sirena/parser/mindmap.rb +106 -0
- data/lib/sirena/parser/packet.rb +76 -0
- data/lib/sirena/parser/pie.rb +49 -0
- data/lib/sirena/parser/quadrant.rb +57 -0
- data/lib/sirena/parser/radar.rb +104 -0
- data/lib/sirena/parser/requirement.rb +70 -0
- data/lib/sirena/parser/sankey.rb +64 -0
- data/lib/sirena/parser/sequence.rb +51 -0
- data/lib/sirena/parser/state_diagram.rb +69 -0
- data/lib/sirena/parser/timeline.rb +57 -0
- data/lib/sirena/parser/transforms/architecture.rb +97 -0
- data/lib/sirena/parser/transforms/block.rb +254 -0
- data/lib/sirena/parser/transforms/c4.rb +347 -0
- data/lib/sirena/parser/transforms/class_diagram.rb +352 -0
- data/lib/sirena/parser/transforms/er_diagram.rb +169 -0
- data/lib/sirena/parser/transforms/error.rb +58 -0
- data/lib/sirena/parser/transforms/flowchart.rb +293 -0
- data/lib/sirena/parser/transforms/gantt.rb +215 -0
- data/lib/sirena/parser/transforms/git_graph.rb +160 -0
- data/lib/sirena/parser/transforms/info.rb +58 -0
- data/lib/sirena/parser/transforms/kanban.rb +176 -0
- data/lib/sirena/parser/transforms/mindmap.rb +227 -0
- data/lib/sirena/parser/transforms/packet.rb +63 -0
- data/lib/sirena/parser/transforms/pie.rb +143 -0
- data/lib/sirena/parser/transforms/quadrant.rb +177 -0
- data/lib/sirena/parser/transforms/radar.rb +126 -0
- data/lib/sirena/parser/transforms/requirement.rb +272 -0
- data/lib/sirena/parser/transforms/sankey.rb +122 -0
- data/lib/sirena/parser/transforms/sequence.rb +342 -0
- data/lib/sirena/parser/transforms/state_diagram.rb +292 -0
- data/lib/sirena/parser/transforms/timeline.rb +177 -0
- data/lib/sirena/parser/transforms/treemap.rb +81 -0
- data/lib/sirena/parser/transforms/xy_chart.rb +132 -0
- data/lib/sirena/parser/treemap.rb +98 -0
- data/lib/sirena/parser/user_journey.rb +120 -0
- data/lib/sirena/parser/xy_chart.rb +114 -0
- data/lib/sirena/parser.rb +8 -0
- data/lib/sirena/renderer/architecture.rb +251 -0
- data/lib/sirena/renderer/base.rb +251 -0
- data/lib/sirena/renderer/block.rb +286 -0
- data/lib/sirena/renderer/c4.rb +490 -0
- data/lib/sirena/renderer/class_diagram.rb +499 -0
- data/lib/sirena/renderer/er_diagram.rb +417 -0
- data/lib/sirena/renderer/error.rb +131 -0
- data/lib/sirena/renderer/flowchart.rb +301 -0
- data/lib/sirena/renderer/gantt.rb +331 -0
- data/lib/sirena/renderer/git_graph.rb +368 -0
- data/lib/sirena/renderer/info.rb +93 -0
- data/lib/sirena/renderer/kanban.rb +295 -0
- data/lib/sirena/renderer/mindmap.rb +396 -0
- data/lib/sirena/renderer/packet.rb +239 -0
- data/lib/sirena/renderer/pie.rb +235 -0
- data/lib/sirena/renderer/quadrant.rb +292 -0
- data/lib/sirena/renderer/radar.rb +323 -0
- data/lib/sirena/renderer/requirement.rb +371 -0
- data/lib/sirena/renderer/sankey.rb +255 -0
- data/lib/sirena/renderer/sequence.rb +424 -0
- data/lib/sirena/renderer/state_diagram.rb +328 -0
- data/lib/sirena/renderer/timeline.rb +304 -0
- data/lib/sirena/renderer/treemap.rb +152 -0
- data/lib/sirena/renderer/user_journey.rb +331 -0
- data/lib/sirena/renderer/xy_chart.rb +452 -0
- data/lib/sirena/renderer.rb +8 -0
- data/lib/sirena/svg/circle.rb +41 -0
- data/lib/sirena/svg/document.rb +103 -0
- data/lib/sirena/svg/element.rb +65 -0
- data/lib/sirena/svg/ellipse.rb +33 -0
- data/lib/sirena/svg/group.rb +71 -0
- data/lib/sirena/svg/line.rb +49 -0
- data/lib/sirena/svg/path.rb +76 -0
- data/lib/sirena/svg/polygon.rb +43 -0
- data/lib/sirena/svg/polyline.rb +35 -0
- data/lib/sirena/svg/rect.rb +57 -0
- data/lib/sirena/svg/style.rb +44 -0
- data/lib/sirena/svg/text.rb +72 -0
- data/lib/sirena/svg.rb +19 -0
- data/lib/sirena/text_measurement.rb +71 -0
- data/lib/sirena/theme/builtin/dark.yml +70 -0
- data/lib/sirena/theme/builtin/default.yml +80 -0
- data/lib/sirena/theme/builtin/high_contrast.yml +70 -0
- data/lib/sirena/theme/builtin/light.yml +70 -0
- data/lib/sirena/theme/color_palette.rb +48 -0
- data/lib/sirena/theme/effect_styles.rb +28 -0
- data/lib/sirena/theme/registry.rb +41 -0
- data/lib/sirena/theme/shape_styles.rb +28 -0
- data/lib/sirena/theme/spacing_config.rb +24 -0
- data/lib/sirena/theme/typography.rb +30 -0
- data/lib/sirena/theme.rb +69 -0
- data/lib/sirena/transform/architecture.rb +273 -0
- data/lib/sirena/transform/base.rb +199 -0
- data/lib/sirena/transform/block.rb +215 -0
- data/lib/sirena/transform/c4.rb +288 -0
- data/lib/sirena/transform/class_diagram.rb +296 -0
- data/lib/sirena/transform/er_diagram.rb +204 -0
- data/lib/sirena/transform/error.rb +39 -0
- data/lib/sirena/transform/flowchart.rb +161 -0
- data/lib/sirena/transform/gantt.rb +253 -0
- data/lib/sirena/transform/git_graph.rb +283 -0
- data/lib/sirena/transform/info.rb +39 -0
- data/lib/sirena/transform/kanban.rb +180 -0
- data/lib/sirena/transform/mindmap.rb +251 -0
- data/lib/sirena/transform/packet.rb +185 -0
- data/lib/sirena/transform/pie.rb +62 -0
- data/lib/sirena/transform/quadrant.rb +167 -0
- data/lib/sirena/transform/radar.rb +227 -0
- data/lib/sirena/transform/requirement.rb +233 -0
- data/lib/sirena/transform/sankey.rb +212 -0
- data/lib/sirena/transform/sequence.rb +143 -0
- data/lib/sirena/transform/state_diagram.rb +228 -0
- data/lib/sirena/transform/timeline.rb +139 -0
- data/lib/sirena/transform/treemap.rb +120 -0
- data/lib/sirena/transform/user_journey.rb +207 -0
- data/lib/sirena/transform/xy_chart.rb +273 -0
- data/lib/sirena/transform.rb +8 -0
- data/lib/sirena/version.rb +5 -0
- data/lib/sirena.rb +328 -0
- data/lib/tasks/benchmark.rake +532 -0
- data/lib/tasks/examples.rake +468 -0
- data/lib/tasks/generate_mermaid_fixtures.rake +363 -0
- data/lib/tasks/mermaid_fixtures.rake +46 -0
- data/scripts/extract_mermaid_tests.rb +493 -0
- data/scripts/rename_to_sirena.rb +73 -0
- data/sirena.gemspec +47 -0
- metadata +529 -0
|
@@ -0,0 +1,719 @@
|
|
|
1
|
+
= Entity relationship diagrams
|
|
2
|
+
:toc:
|
|
3
|
+
:toclevels: 3
|
|
4
|
+
|
|
5
|
+
== Overview
|
|
6
|
+
|
|
7
|
+
Entity Relationship (ER) diagrams in Sirena model the relationships between entities in a database or data model. They are essential for database design, showing entities (tables), their attributes (columns), and the relationships between them.
|
|
8
|
+
|
|
9
|
+
ER diagrams are useful for:
|
|
10
|
+
|
|
11
|
+
* Database schema design and documentation
|
|
12
|
+
* Planning data models before implementation
|
|
13
|
+
* Communicating data structure to stakeholders
|
|
14
|
+
* Identifying relationships and cardinality
|
|
15
|
+
* Normalizing database structures
|
|
16
|
+
* Visualizing entity dependencies
|
|
17
|
+
|
|
18
|
+
== Syntax specification
|
|
19
|
+
|
|
20
|
+
=== Diagram declaration
|
|
21
|
+
|
|
22
|
+
ER diagrams are declared using the `erDiagram` keyword:
|
|
23
|
+
|
|
24
|
+
[source,mermaid]
|
|
25
|
+
----
|
|
26
|
+
erDiagram
|
|
27
|
+
<diagram-content>
|
|
28
|
+
----
|
|
29
|
+
|
|
30
|
+
=== Entities
|
|
31
|
+
|
|
32
|
+
Entities are defined implicitly through relationships or explicitly with attributes:
|
|
33
|
+
|
|
34
|
+
[source,mermaid]
|
|
35
|
+
----
|
|
36
|
+
erDiagram
|
|
37
|
+
CUSTOMER
|
|
38
|
+
ORDER
|
|
39
|
+
----
|
|
40
|
+
|
|
41
|
+
=== Relationships
|
|
42
|
+
|
|
43
|
+
Relationships connect entities and specify cardinality:
|
|
44
|
+
|
|
45
|
+
[source,mermaid]
|
|
46
|
+
----
|
|
47
|
+
erDiagram
|
|
48
|
+
CUSTOMER ||--o{ ORDER : places
|
|
49
|
+
----
|
|
50
|
+
|
|
51
|
+
==== Relationship syntax
|
|
52
|
+
|
|
53
|
+
The basic syntax is:
|
|
54
|
+
|
|
55
|
+
[source]
|
|
56
|
+
----
|
|
57
|
+
<first-entity> [<relationship>] <second-entity> : <relationship-label>
|
|
58
|
+
----
|
|
59
|
+
|
|
60
|
+
==== Cardinality and relationship types
|
|
61
|
+
|
|
62
|
+
Relationships consist of three parts:
|
|
63
|
+
|
|
64
|
+
1. Left cardinality/relationship
|
|
65
|
+
2. Relationship line style
|
|
66
|
+
3. Right cardinality/relationship
|
|
67
|
+
|
|
68
|
+
[cols="2,2,3"]
|
|
69
|
+
|===
|
|
70
|
+
|Symbol |Meaning |Description
|
|
71
|
+
|
|
72
|
+
|`\|o`
|
|
73
|
+
|Zero or one
|
|
74
|
+
|Optional relationship (0 or 1)
|
|
75
|
+
|
|
76
|
+
|`\|\|`
|
|
77
|
+
|Exactly one
|
|
78
|
+
|Mandatory relationship (1)
|
|
79
|
+
|
|
80
|
+
|`}o`
|
|
81
|
+
|Zero or more
|
|
82
|
+
|Optional many (0 or more)
|
|
83
|
+
|
|
84
|
+
|`}\|`
|
|
85
|
+
|One or more
|
|
86
|
+
|Mandatory many (1 or more)
|
|
87
|
+
|===
|
|
88
|
+
|
|
89
|
+
==== Relationship line styles
|
|
90
|
+
|
|
91
|
+
[cols="2,3"]
|
|
92
|
+
|===
|
|
93
|
+
|Symbol |Meaning
|
|
94
|
+
|
|
95
|
+
|`--`
|
|
96
|
+
|Non-identifying relationship
|
|
97
|
+
|
|
98
|
+
|`..`
|
|
99
|
+
|Identifying relationship (not commonly used)
|
|
100
|
+
|===
|
|
101
|
+
|
|
102
|
+
==== Common relationship patterns
|
|
103
|
+
|
|
104
|
+
[cols="3,2,3"]
|
|
105
|
+
|===
|
|
106
|
+
|Syntax |Reads as |Description
|
|
107
|
+
|
|
108
|
+
|`\|\|--o{`
|
|
109
|
+
|One to zero or more
|
|
110
|
+
|One entity has many optional related entities
|
|
111
|
+
|
|
112
|
+
|`\|\|--\|\{`
|
|
113
|
+
|One to one or more
|
|
114
|
+
|One entity has many required related entities
|
|
115
|
+
|
|
116
|
+
|`\|\|--\|\|`
|
|
117
|
+
|One to one
|
|
118
|
+
|Exactly one-to-one relationship
|
|
119
|
+
|
|
120
|
+
|`\|\|--o\|`
|
|
121
|
+
|One to zero or one
|
|
122
|
+
|Optional one-to-one relationship
|
|
123
|
+
|
|
124
|
+
|`}o--o{`
|
|
125
|
+
|Zero or more to zero or more
|
|
126
|
+
|Many-to-many optional relationship
|
|
127
|
+
|
|
128
|
+
|`}o--\|\|`
|
|
129
|
+
|Zero or more to exactly one
|
|
130
|
+
|Many optional to one required
|
|
131
|
+
|===
|
|
132
|
+
|
|
133
|
+
=== Attributes
|
|
134
|
+
|
|
135
|
+
Attributes define the properties of entities:
|
|
136
|
+
|
|
137
|
+
[source,mermaid]
|
|
138
|
+
----
|
|
139
|
+
erDiagram
|
|
140
|
+
CUSTOMER {
|
|
141
|
+
int id
|
|
142
|
+
string name
|
|
143
|
+
string email
|
|
144
|
+
}
|
|
145
|
+
----
|
|
146
|
+
|
|
147
|
+
==== Attribute syntax
|
|
148
|
+
|
|
149
|
+
[source]
|
|
150
|
+
----
|
|
151
|
+
<type> <name> [<key-type>] ["comment"]
|
|
152
|
+
----
|
|
153
|
+
|
|
154
|
+
Where:
|
|
155
|
+
|
|
156
|
+
* `type` is the data type (int, string, varchar, etc.)
|
|
157
|
+
* `name` is the attribute name
|
|
158
|
+
* `key-type` (optional) can be:
|
|
159
|
+
- `PK` - Primary Key
|
|
160
|
+
- `FK` - Foreign Key
|
|
161
|
+
- `UK` - Unique Key
|
|
162
|
+
* `comment` (optional) is a descriptive comment
|
|
163
|
+
|
|
164
|
+
==== Example with keys
|
|
165
|
+
|
|
166
|
+
[source,mermaid]
|
|
167
|
+
----
|
|
168
|
+
erDiagram
|
|
169
|
+
USER {
|
|
170
|
+
int id PK "Primary identifier"
|
|
171
|
+
string username UK "Unique username"
|
|
172
|
+
string email UK "Unique email address"
|
|
173
|
+
string password_hash "Hashed password"
|
|
174
|
+
}
|
|
175
|
+
----
|
|
176
|
+
|
|
177
|
+
=== Relationship labels
|
|
178
|
+
|
|
179
|
+
Relationships can have descriptive labels:
|
|
180
|
+
|
|
181
|
+
[source,mermaid]
|
|
182
|
+
----
|
|
183
|
+
erDiagram
|
|
184
|
+
CUSTOMER ||--o{ ORDER : places
|
|
185
|
+
ORDER ||--|{ ORDER_ITEM : contains
|
|
186
|
+
PRODUCT ||--o{ ORDER_ITEM : "ordered in"
|
|
187
|
+
----
|
|
188
|
+
|
|
189
|
+
== Examples
|
|
190
|
+
|
|
191
|
+
=== Basic ER diagram
|
|
192
|
+
|
|
193
|
+
.Simple two-entity relationship
|
|
194
|
+
[example]
|
|
195
|
+
====
|
|
196
|
+
[source,mermaid]
|
|
197
|
+
----
|
|
198
|
+
erDiagram
|
|
199
|
+
CUSTOMER ||--o{ ORDER : places
|
|
200
|
+
----
|
|
201
|
+
|
|
202
|
+
This creates a simple ER diagram showing:
|
|
203
|
+
|
|
204
|
+
* One customer can place zero or more orders
|
|
205
|
+
* Each order is placed by exactly one customer
|
|
206
|
+
====
|
|
207
|
+
|
|
208
|
+
=== Entities with attributes
|
|
209
|
+
|
|
210
|
+
.Complete entity definitions
|
|
211
|
+
[example]
|
|
212
|
+
====
|
|
213
|
+
[source,mermaid]
|
|
214
|
+
----
|
|
215
|
+
erDiagram
|
|
216
|
+
CUSTOMER {
|
|
217
|
+
int id PK
|
|
218
|
+
string name
|
|
219
|
+
string email UK
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
ORDER {
|
|
223
|
+
int id PK
|
|
224
|
+
int customer_id FK
|
|
225
|
+
date order_date
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
CUSTOMER ||--o{ ORDER : places
|
|
229
|
+
----
|
|
230
|
+
|
|
231
|
+
This demonstrates:
|
|
232
|
+
|
|
233
|
+
* Entity definitions with attributes
|
|
234
|
+
* Primary keys (PK)
|
|
235
|
+
* Foreign keys (FK)
|
|
236
|
+
* Unique keys (UK)
|
|
237
|
+
* One-to-many relationship
|
|
238
|
+
====
|
|
239
|
+
|
|
240
|
+
=== Multiple relationships
|
|
241
|
+
|
|
242
|
+
.Complex relationship network
|
|
243
|
+
[example]
|
|
244
|
+
====
|
|
245
|
+
[source,mermaid]
|
|
246
|
+
----
|
|
247
|
+
erDiagram
|
|
248
|
+
USER ||--o{ POST : writes
|
|
249
|
+
USER ||--o{ COMMENT : writes
|
|
250
|
+
POST ||--o{ COMMENT : has
|
|
251
|
+
POST }o--|| CATEGORY : belongs_to
|
|
252
|
+
POST }o--o{ TAG : tagged_with
|
|
253
|
+
----
|
|
254
|
+
|
|
255
|
+
This shows:
|
|
256
|
+
|
|
257
|
+
* Multiple relationships from one entity
|
|
258
|
+
* One-to-many relationships (`||--o{`)
|
|
259
|
+
* Many-to-one relationships (`}o--||`)
|
|
260
|
+
* Many-to-many relationships (`}o--o{`)
|
|
261
|
+
====
|
|
262
|
+
|
|
263
|
+
=== Complete database schema
|
|
264
|
+
|
|
265
|
+
.E-commerce database schema
|
|
266
|
+
[example]
|
|
267
|
+
====
|
|
268
|
+
[source,mermaid]
|
|
269
|
+
----
|
|
270
|
+
erDiagram
|
|
271
|
+
USER ||--o{ POST : writes
|
|
272
|
+
USER ||--o{ COMMENT : writes
|
|
273
|
+
POST ||--o{ COMMENT : has
|
|
274
|
+
POST }o--|| CATEGORY : belongs_to
|
|
275
|
+
POST }o--o{ TAG : tagged_with
|
|
276
|
+
USER ||--o{ LIKE : gives
|
|
277
|
+
POST ||--o{ LIKE : receives
|
|
278
|
+
COMMENT ||--o{ LIKE : receives
|
|
279
|
+
|
|
280
|
+
USER {
|
|
281
|
+
int id PK
|
|
282
|
+
string username UK
|
|
283
|
+
string email UK
|
|
284
|
+
string password_hash
|
|
285
|
+
datetime created_at
|
|
286
|
+
datetime updated_at
|
|
287
|
+
boolean is_active
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
POST {
|
|
291
|
+
int id PK
|
|
292
|
+
int user_id FK
|
|
293
|
+
int category_id FK
|
|
294
|
+
string title
|
|
295
|
+
text content
|
|
296
|
+
string slug UK
|
|
297
|
+
datetime published_at
|
|
298
|
+
datetime created_at
|
|
299
|
+
datetime updated_at
|
|
300
|
+
int view_count
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
COMMENT {
|
|
304
|
+
int id PK
|
|
305
|
+
int post_id FK
|
|
306
|
+
int user_id FK
|
|
307
|
+
int parent_id FK
|
|
308
|
+
text content
|
|
309
|
+
datetime created_at
|
|
310
|
+
datetime updated_at
|
|
311
|
+
boolean is_approved
|
|
312
|
+
}
|
|
313
|
+
|
|
314
|
+
CATEGORY {
|
|
315
|
+
int id PK
|
|
316
|
+
string name UK
|
|
317
|
+
string slug UK
|
|
318
|
+
text description
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
TAG {
|
|
322
|
+
int id PK
|
|
323
|
+
string name UK
|
|
324
|
+
string slug UK
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
LIKE {
|
|
328
|
+
int id PK
|
|
329
|
+
int user_id FK
|
|
330
|
+
int post_id FK
|
|
331
|
+
int comment_id FK
|
|
332
|
+
datetime created_at
|
|
333
|
+
}
|
|
334
|
+
----
|
|
335
|
+
|
|
336
|
+
This comprehensive example includes:
|
|
337
|
+
|
|
338
|
+
* Multiple entities with full attribute definitions
|
|
339
|
+
* Various relationship types
|
|
340
|
+
* Primary and foreign keys
|
|
341
|
+
* Unique constraints
|
|
342
|
+
* Different data types
|
|
343
|
+
* Complex relationship network
|
|
344
|
+
====
|
|
345
|
+
|
|
346
|
+
=== Self-referential relationship
|
|
347
|
+
|
|
348
|
+
.Hierarchical data structure
|
|
349
|
+
[example]
|
|
350
|
+
====
|
|
351
|
+
[source,mermaid]
|
|
352
|
+
----
|
|
353
|
+
erDiagram
|
|
354
|
+
EMPLOYEE ||--o{ EMPLOYEE : manages
|
|
355
|
+
|
|
356
|
+
EMPLOYEE {
|
|
357
|
+
int id PK
|
|
358
|
+
string name
|
|
359
|
+
string email UK
|
|
360
|
+
int manager_id FK
|
|
361
|
+
string position
|
|
362
|
+
}
|
|
363
|
+
----
|
|
364
|
+
|
|
365
|
+
This demonstrates:
|
|
366
|
+
|
|
367
|
+
* Self-referential relationship
|
|
368
|
+
* Hierarchical structure (employees managing employees)
|
|
369
|
+
* Foreign key referencing the same table
|
|
370
|
+
====
|
|
371
|
+
|
|
372
|
+
=== Many-to-many with junction table
|
|
373
|
+
|
|
374
|
+
.Explicit junction table for many-to-many
|
|
375
|
+
[example]
|
|
376
|
+
====
|
|
377
|
+
[source,mermaid]
|
|
378
|
+
----
|
|
379
|
+
erDiagram
|
|
380
|
+
STUDENT ||--o{ ENROLLMENT : has
|
|
381
|
+
COURSE ||--o{ ENROLLMENT : includes
|
|
382
|
+
ENROLLMENT }o--|| STUDENT : belongs_to
|
|
383
|
+
ENROLLMENT }o--|| COURSE : is_for
|
|
384
|
+
|
|
385
|
+
STUDENT {
|
|
386
|
+
int id PK
|
|
387
|
+
string name
|
|
388
|
+
string email UK
|
|
389
|
+
date enrollment_date
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
COURSE {
|
|
393
|
+
int id PK
|
|
394
|
+
string code UK
|
|
395
|
+
string title
|
|
396
|
+
int credits
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
ENROLLMENT {
|
|
400
|
+
int id PK
|
|
401
|
+
int student_id FK
|
|
402
|
+
int course_id FK
|
|
403
|
+
date enrolled_date
|
|
404
|
+
string grade
|
|
405
|
+
}
|
|
406
|
+
----
|
|
407
|
+
|
|
408
|
+
This shows:
|
|
409
|
+
|
|
410
|
+
* Explicit junction table for many-to-many relationship
|
|
411
|
+
* Junction table with its own attributes
|
|
412
|
+
* Multiple relationships connecting the junction table
|
|
413
|
+
====
|
|
414
|
+
|
|
415
|
+
=== One-to-one relationships
|
|
416
|
+
|
|
417
|
+
.User profile relationship
|
|
418
|
+
[example]
|
|
419
|
+
====
|
|
420
|
+
[source,mermaid]
|
|
421
|
+
----
|
|
422
|
+
erDiagram
|
|
423
|
+
USER ||--|| USER_PROFILE : has
|
|
424
|
+
USER ||--o| BILLING_INFO : has
|
|
425
|
+
|
|
426
|
+
USER {
|
|
427
|
+
int id PK
|
|
428
|
+
string username UK
|
|
429
|
+
string email UK
|
|
430
|
+
}
|
|
431
|
+
|
|
432
|
+
USER_PROFILE {
|
|
433
|
+
int id PK
|
|
434
|
+
int user_id FK
|
|
435
|
+
string full_name
|
|
436
|
+
string bio
|
|
437
|
+
string avatar_url
|
|
438
|
+
}
|
|
439
|
+
|
|
440
|
+
BILLING_INFO {
|
|
441
|
+
int id PK
|
|
442
|
+
int user_id FK
|
|
443
|
+
string address
|
|
444
|
+
string payment_method
|
|
445
|
+
}
|
|
446
|
+
----
|
|
447
|
+
|
|
448
|
+
This demonstrates:
|
|
449
|
+
|
|
450
|
+
* Mandatory one-to-one relationship (`||--||`)
|
|
451
|
+
* Optional one-to-one relationship (`||--o|`)
|
|
452
|
+
* Extended user information in separate tables
|
|
453
|
+
====
|
|
454
|
+
|
|
455
|
+
=== Database with all cardinality types
|
|
456
|
+
|
|
457
|
+
.Comprehensive cardinality example
|
|
458
|
+
[example]
|
|
459
|
+
====
|
|
460
|
+
[source,mermaid]
|
|
461
|
+
----
|
|
462
|
+
erDiagram
|
|
463
|
+
PERSON ||--o| PASSPORT : has
|
|
464
|
+
PERSON ||--o{ PHONE : owns
|
|
465
|
+
COMPANY ||--|{ EMPLOYEE : employs
|
|
466
|
+
EMPLOYEE }o--|| DEPARTMENT : works_in
|
|
467
|
+
PROJECT }o--o{ EMPLOYEE : assigned_to
|
|
468
|
+
|
|
469
|
+
PERSON {
|
|
470
|
+
int id PK
|
|
471
|
+
string name
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
PASSPORT {
|
|
475
|
+
int id PK
|
|
476
|
+
int person_id FK
|
|
477
|
+
string number UK
|
|
478
|
+
}
|
|
479
|
+
|
|
480
|
+
PHONE {
|
|
481
|
+
int id PK
|
|
482
|
+
int person_id FK
|
|
483
|
+
string number
|
|
484
|
+
}
|
|
485
|
+
|
|
486
|
+
COMPANY {
|
|
487
|
+
int id PK
|
|
488
|
+
string name
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
DEPARTMENT {
|
|
492
|
+
int id PK
|
|
493
|
+
int company_id FK
|
|
494
|
+
string name
|
|
495
|
+
}
|
|
496
|
+
|
|
497
|
+
EMPLOYEE {
|
|
498
|
+
int id PK
|
|
499
|
+
int person_id FK
|
|
500
|
+
int department_id FK
|
|
501
|
+
}
|
|
502
|
+
|
|
503
|
+
PROJECT {
|
|
504
|
+
int id PK
|
|
505
|
+
string name
|
|
506
|
+
}
|
|
507
|
+
----
|
|
508
|
+
|
|
509
|
+
This comprehensive example shows:
|
|
510
|
+
|
|
511
|
+
* One-to-zero-or-one (`||--o|`) - person may have passport
|
|
512
|
+
* One-to-many (`||--o{`) - person can have multiple phones
|
|
513
|
+
* One-to-one-or-more (`||--|{`) - company must have employees
|
|
514
|
+
* Many-to-one (`}o--||`) - employees work in one department
|
|
515
|
+
* Many-to-many (`}o--o{`) - projects and employees
|
|
516
|
+
====
|
|
517
|
+
|
|
518
|
+
== Features
|
|
519
|
+
|
|
520
|
+
=== Data types
|
|
521
|
+
|
|
522
|
+
Common data types include:
|
|
523
|
+
|
|
524
|
+
* `int`, `integer` - Integer numbers
|
|
525
|
+
* `string`, `varchar` - Text strings
|
|
526
|
+
* `text` - Long text
|
|
527
|
+
* `date` - Date values
|
|
528
|
+
* `datetime`, `timestamp` - Date and time
|
|
529
|
+
* `boolean`, `bool` - True/false values
|
|
530
|
+
* `float`, `decimal` - Decimal numbers
|
|
531
|
+
|
|
532
|
+
Custom types are also supported:
|
|
533
|
+
|
|
534
|
+
[source,mermaid]
|
|
535
|
+
----
|
|
536
|
+
erDiagram
|
|
537
|
+
PRODUCT {
|
|
538
|
+
uuid id PK
|
|
539
|
+
money price
|
|
540
|
+
json metadata
|
|
541
|
+
}
|
|
542
|
+
----
|
|
543
|
+
|
|
544
|
+
=== Attribute comments
|
|
545
|
+
|
|
546
|
+
Attributes can have comments for documentation:
|
|
547
|
+
|
|
548
|
+
[source,mermaid]
|
|
549
|
+
----
|
|
550
|
+
erDiagram
|
|
551
|
+
USER {
|
|
552
|
+
int id PK "Auto-incrementing primary key"
|
|
553
|
+
string email UK "Must be unique and valid"
|
|
554
|
+
datetime created_at "Account creation timestamp"
|
|
555
|
+
}
|
|
556
|
+
----
|
|
557
|
+
|
|
558
|
+
=== Multiple foreign keys
|
|
559
|
+
|
|
560
|
+
Entities can reference multiple other entities:
|
|
561
|
+
|
|
562
|
+
[source,mermaid]
|
|
563
|
+
----
|
|
564
|
+
erDiagram
|
|
565
|
+
ORDER {
|
|
566
|
+
int id PK
|
|
567
|
+
int customer_id FK
|
|
568
|
+
int shipping_address_id FK
|
|
569
|
+
int billing_address_id FK
|
|
570
|
+
}
|
|
571
|
+
----
|
|
572
|
+
|
|
573
|
+
=== Composite keys
|
|
574
|
+
|
|
575
|
+
While not explicitly shown in syntax, you can document composite keys in comments:
|
|
576
|
+
|
|
577
|
+
[source,mermaid]
|
|
578
|
+
----
|
|
579
|
+
erDiagram
|
|
580
|
+
ENROLLMENT {
|
|
581
|
+
int student_id FK "Part of composite PK"
|
|
582
|
+
int course_id FK "Part of composite PK"
|
|
583
|
+
date enrollment_date
|
|
584
|
+
}
|
|
585
|
+
----
|
|
586
|
+
|
|
587
|
+
== Limitations
|
|
588
|
+
|
|
589
|
+
=== Currently not supported
|
|
590
|
+
|
|
591
|
+
The following Mermaid ER diagram features are not yet supported in Sirena:
|
|
592
|
+
|
|
593
|
+
* Custom styling with CSS classes
|
|
594
|
+
* Click events and links
|
|
595
|
+
* Entity grouping or namespaces
|
|
596
|
+
* Weak entities (double borders)
|
|
597
|
+
* Identifying relationships with double lines
|
|
598
|
+
* Attribute-level constraints beyond PK, FK, UK
|
|
599
|
+
|
|
600
|
+
=== Known issues
|
|
601
|
+
|
|
602
|
+
* Very large diagrams with many entities may become cluttered
|
|
603
|
+
* Long relationship labels may overlap with entities
|
|
604
|
+
* Complex many-to-many relationships may need manual layout adjustment
|
|
605
|
+
|
|
606
|
+
== Best practices
|
|
607
|
+
|
|
608
|
+
=== Use clear entity names
|
|
609
|
+
|
|
610
|
+
Choose descriptive, singular nouns for entities:
|
|
611
|
+
|
|
612
|
+
[source,mermaid]
|
|
613
|
+
----
|
|
614
|
+
%% Good - singular, clear names
|
|
615
|
+
erDiagram
|
|
616
|
+
CUSTOMER
|
|
617
|
+
ORDER
|
|
618
|
+
PRODUCT
|
|
619
|
+
|
|
620
|
+
%% Less clear - plural or abbreviated
|
|
621
|
+
erDiagram
|
|
622
|
+
CUSTOMERS
|
|
623
|
+
ORDS
|
|
624
|
+
PRODS
|
|
625
|
+
----
|
|
626
|
+
|
|
627
|
+
=== Document key relationships
|
|
628
|
+
|
|
629
|
+
Always identify primary and foreign keys:
|
|
630
|
+
|
|
631
|
+
[source,mermaid]
|
|
632
|
+
----
|
|
633
|
+
erDiagram
|
|
634
|
+
ORDER {
|
|
635
|
+
int id PK
|
|
636
|
+
int customer_id FK
|
|
637
|
+
int product_id FK
|
|
638
|
+
}
|
|
639
|
+
----
|
|
640
|
+
|
|
641
|
+
=== Use appropriate cardinality
|
|
642
|
+
|
|
643
|
+
Choose the correct cardinality for relationships:
|
|
644
|
+
|
|
645
|
+
[source,mermaid]
|
|
646
|
+
----
|
|
647
|
+
%% One customer, many orders
|
|
648
|
+
CUSTOMER ||--o{ ORDER : places
|
|
649
|
+
|
|
650
|
+
%% Many-to-many with junction table
|
|
651
|
+
STUDENT }o--o{ COURSE : enrolls_in
|
|
652
|
+
----
|
|
653
|
+
|
|
654
|
+
=== Group related entities visually
|
|
655
|
+
|
|
656
|
+
When creating the diagram, place related entities near each other:
|
|
657
|
+
|
|
658
|
+
[source,mermaid]
|
|
659
|
+
----
|
|
660
|
+
erDiagram
|
|
661
|
+
%% User-related entities together
|
|
662
|
+
USER ||--o{ POST : writes
|
|
663
|
+
USER ||--o{ COMMENT : writes
|
|
664
|
+
|
|
665
|
+
%% Content-related entities together
|
|
666
|
+
POST ||--o{ COMMENT : has
|
|
667
|
+
POST }o--|| CATEGORY : belongs_to
|
|
668
|
+
----
|
|
669
|
+
|
|
670
|
+
=== Add meaningful comments
|
|
671
|
+
|
|
672
|
+
Use comments to clarify constraints:
|
|
673
|
+
|
|
674
|
+
[source,mermaid]
|
|
675
|
+
----
|
|
676
|
+
erDiagram
|
|
677
|
+
USER {
|
|
678
|
+
int id PK "Auto-generated"
|
|
679
|
+
string email UK "Lowercase, validated"
|
|
680
|
+
datetime last_login "Nullable"
|
|
681
|
+
}
|
|
682
|
+
----
|
|
683
|
+
|
|
684
|
+
=== Keep diagrams focused
|
|
685
|
+
|
|
686
|
+
For large systems, create multiple diagrams:
|
|
687
|
+
|
|
688
|
+
* One diagram per domain/module
|
|
689
|
+
* Separate diagrams for different abstraction levels
|
|
690
|
+
* Core entities in one diagram, auxiliary in another
|
|
691
|
+
|
|
692
|
+
=== Use consistent naming
|
|
693
|
+
|
|
694
|
+
Maintain naming consistency:
|
|
695
|
+
|
|
696
|
+
[source,mermaid]
|
|
697
|
+
----
|
|
698
|
+
%% Consistent ID naming
|
|
699
|
+
CUSTOMER {
|
|
700
|
+
int id PK
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
ORDER {
|
|
704
|
+
int id PK
|
|
705
|
+
int customer_id FK
|
|
706
|
+
}
|
|
707
|
+
|
|
708
|
+
%% Consistent timestamp naming
|
|
709
|
+
POST {
|
|
710
|
+
datetime created_at
|
|
711
|
+
datetime updated_at
|
|
712
|
+
}
|
|
713
|
+
----
|
|
714
|
+
|
|
715
|
+
== Related documentation
|
|
716
|
+
|
|
717
|
+
* <<index.adoc#,Diagram types overview>>
|
|
718
|
+
* <<class-diagram.adoc#,Class diagrams>>
|
|
719
|
+
* link:https://mermaid.js.org/syntax/entityRelationshipDiagram.html[Official Mermaid ER diagram documentation]
|