@wipal/agent-team 1.0.4 → 1.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.
- package/.claude/commands/skills/discover.md +127 -0
- package/.claude/commands/skills/install.md +225 -0
- package/.claude/commands/skills/review.md +234 -0
- package/.claude/commands/utils/learn.md +142 -0
- package/.claude/commands/utils/retrospect.md +62 -0
- package/.claude/commands/utils/switch.md +113 -0
- package/.claude/commands/utils/sync.md +183 -0
- package/.claude/rules/common/general-rules.md +6 -0
- package/.claude/rules/role-rules/dev-be-rules.md +241 -0
- package/.claude/rules/role-rules/dev-fe-rules.md +76 -0
- package/.claude/skills/SKILL-INDEX.md +24 -5
- package/.claude/skills/core/knowledge-graph/SKILL.md +214 -0
- package/.claude/skills/core/sequential-thinking/SKILL.md +112 -0
- package/.claude/skills/core/sequential-thinking/references/advanced.md +122 -0
- package/.claude/skills/core/sequential-thinking/references/examples.md +274 -0
- package/.claude/skills/domain/architecture/c4-architecture/SKILL.md +314 -0
- package/.claude/skills/domain/architecture/c4-architecture/references/advanced-patterns.md +552 -0
- package/.claude/skills/domain/architecture/c4-architecture/references/c4-syntax.md +492 -0
- package/.claude/skills/domain/architecture/c4-architecture/references/common-mistakes.md +437 -0
- package/.claude/skills/domain/architecture/mermaid-diagrams/SKILL.md +238 -0
- package/.claude/skills/domain/architecture/mermaid-diagrams/references/advanced-features.md +556 -0
- package/.claude/skills/domain/architecture/mermaid-diagrams/references/architecture-diagrams.md +192 -0
- package/.claude/skills/domain/architecture/mermaid-diagrams/references/c4-diagrams.md +410 -0
- package/.claude/skills/domain/architecture/mermaid-diagrams/references/class-diagrams.md +361 -0
- package/.claude/skills/domain/architecture/mermaid-diagrams/references/erd-diagrams.md +510 -0
- package/.claude/skills/domain/architecture/mermaid-diagrams/references/flowcharts.md +450 -0
- package/.claude/skills/domain/architecture/mermaid-diagrams/references/sequence-diagrams.md +394 -0
- package/.claude/skills/domain/backend/testing-be/SKILL.md +121 -17
- package/.claude/skills/domain/design/design-system/SKILL.md +169 -0
- package/.claude/skills/domain/design/html-css-output/SKILL.md +253 -0
- package/.claude/skills/domain/design/mockup-creation/SKILL.md +230 -0
- package/.claude/skills/domain/design/responsive-design/SKILL.md +207 -0
- package/.claude/skills/domain/design/ui-design/SKILL.md +124 -0
- package/.claude/skills/domain/frontend/testing-fe/SKILL.md +143 -38
- package/.claude/skills/domain/frontend/ui-ux-pro-max/README.md +45 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/SKILL.md +404 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/charts.csv +26 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/colors.csv +97 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/icons.csv +101 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/landing.csv +31 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/products.csv +97 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/react-performance.csv +45 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/astro.csv +54 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/flutter.csv +53 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/html-tailwind.csv +56 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/jetpack-compose.csv +53 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/nextjs.csv +53 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/nuxt-ui.csv +51 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/nuxtjs.csv +59 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/react-native.csv +52 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/react.csv +54 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/shadcn.csv +61 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/svelte.csv +54 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/swiftui.csv +51 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/stacks/vue.csv +50 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/styles.csv +68 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/typography.csv +58 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/ui-reasoning.csv +101 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/ux-guidelines.csv +100 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/data/web-interface.csv +31 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/scripts/core.py +253 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/scripts/design_system.py +1067 -0
- package/.claude/skills/domain/frontend/ui-ux-pro-max/scripts/search.py +114 -0
- package/.claude/skills/domain/product/requirements-clarity/SKILL.md +340 -0
- package/.claude/skills/skills-registry.yaml +103 -8
- package/README.md +107 -33
- package/README.npm.md +252 -0
- package/TUTORIAL.md +256 -0
- package/bin/agent-team.js +26 -7
- package/config/roles.yaml +107 -0
- package/docs/01-architecture.md +699 -0
- package/docs/02-setup-guide.md +634 -0
- package/docs/03-skills-guide.md +628 -0
- package/docs/04-workflows.md +792 -0
- package/docs/05-model-strategy.md +550 -0
- package/docs/06-extend-guide.md +1226 -0
- package/docs/07-quick-reference.md +578 -0
- package/docs/08-skills-discovery.md +342 -0
- package/docs/README.md +134 -0
- package/docs/rqm.md +560 -0
- package/package.json +9 -3
- package/scripts/postinstall.js +46 -0
- package/src/commands/add.js +131 -67
- package/src/commands/init.js +419 -9
- package/src/commands/list.js +20 -16
- package/src/commands/projects.js +127 -0
- package/src/commands/setup-hooks.js +261 -0
- package/src/index.js +0 -1
- package/src/utils/file-utils.js +147 -50
- package/src/utils/global-registry.js +224 -0
- package/templates/CLAUDE.md.tmpl +128 -20
- package/templates/MEMORY.md.tmpl +119 -0
- package/templates/agent.md.tmpl +205 -0
- package/templates/code/nestjs-controller.ts.tmpl +49 -0
- package/templates/code/nestjs-dto.ts.tmpl +63 -0
- package/templates/code/nestjs-service.ts.tmpl +45 -0
- package/templates/code/react-component.tsx.tmpl +24 -0
- package/templates/code/react-hook.ts.tmpl +54 -0
- package/templates/code/test.spec.ts.tmpl +50 -0
- package/templates/code/vue-component.vue.tmpl +49 -0
- package/templates/code/vue-composable.ts.tmpl +54 -0
- package/templates/knowledge.md.tmpl +152 -17
- package/templates/meeting-notes.md.tmpl +110 -0
- package/templates/memory/hooks.memory.json +50 -0
- package/templates/memory/settings.memory.json +16 -0
- package/templates/reports/bug-report.md.tmpl +164 -0
- package/templates/reports/code-review.md.tmpl +201 -0
- package/templates/reports/sprint-report.md.tmpl +218 -0
- package/templates/roles/ba.md +53 -0
- package/templates/roles/designer.md +82 -0
- package/templates/roles/dev-be.md +49 -0
- package/templates/roles/dev-fe.md +49 -0
- package/templates/roles/devops.md +53 -0
- package/templates/roles/pm.md +49 -0
- package/templates/roles/qa.md +53 -0
- package/templates/roles/sa.md +49 -0
- package/templates/roles/tech-lead.md +132 -0
- package/templates/skills/memory/memory-status.md +78 -0
- package/templates/skills/memory/recall.md +160 -0
- package/templates/skills/memory/reflect.md +168 -0
- package/templates/skills/memory/remember.md +105 -0
- package/templates/tasks/lessons.md.tmpl +77 -0
- package/templates/tasks/todo.md.tmpl +53 -0
- package/src/commands/switch.js +0 -53
|
@@ -0,0 +1,510 @@
|
|
|
1
|
+
# Entity Relationship Diagrams (ERD)
|
|
2
|
+
|
|
3
|
+
ERDs model database schemas, showing tables (entities), their columns (attributes), and relationships between tables. Essential for database design and documentation.
|
|
4
|
+
|
|
5
|
+
## Basic Syntax
|
|
6
|
+
|
|
7
|
+
```mermaid
|
|
8
|
+
erDiagram
|
|
9
|
+
CUSTOMER ||--o{ ORDER : places
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
## Defining Entities
|
|
13
|
+
|
|
14
|
+
```mermaid
|
|
15
|
+
erDiagram
|
|
16
|
+
CUSTOMER
|
|
17
|
+
ORDER
|
|
18
|
+
PRODUCT
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Entity Attributes
|
|
22
|
+
|
|
23
|
+
Define columns with type and constraints:
|
|
24
|
+
|
|
25
|
+
```mermaid
|
|
26
|
+
erDiagram
|
|
27
|
+
CUSTOMER {
|
|
28
|
+
int id PK
|
|
29
|
+
string email UK
|
|
30
|
+
string name
|
|
31
|
+
string phone
|
|
32
|
+
datetime created_at
|
|
33
|
+
}
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
**Attribute format:** `type name constraints`
|
|
37
|
+
|
|
38
|
+
**Common constraints:**
|
|
39
|
+
- `PK` - Primary Key
|
|
40
|
+
- `FK` - Foreign Key
|
|
41
|
+
- `UK` - Unique Key
|
|
42
|
+
- `NN` - Not Null
|
|
43
|
+
|
|
44
|
+
## Relationships
|
|
45
|
+
|
|
46
|
+
### Relationship Symbols
|
|
47
|
+
|
|
48
|
+
**Cardinality indicators:**
|
|
49
|
+
- `||` - Exactly one
|
|
50
|
+
- `|o` - Zero or one
|
|
51
|
+
- `}{` - One or many
|
|
52
|
+
- `}o` - Zero or many
|
|
53
|
+
|
|
54
|
+
**Relationship line:**
|
|
55
|
+
- `--` - Non-identifying relationship
|
|
56
|
+
- `..` - Identifying relationship (rare in practice)
|
|
57
|
+
|
|
58
|
+
### Common Relationships
|
|
59
|
+
|
|
60
|
+
```mermaid
|
|
61
|
+
erDiagram
|
|
62
|
+
%% One-to-One
|
|
63
|
+
USER ||--|| PROFILE : has
|
|
64
|
+
|
|
65
|
+
%% One-to-Many
|
|
66
|
+
CUSTOMER ||--o{ ORDER : places
|
|
67
|
+
|
|
68
|
+
%% Many-to-Many (with junction table)
|
|
69
|
+
STUDENT }o--o{ COURSE : enrolls
|
|
70
|
+
STUDENT ||--o{ ENROLLMENT : has
|
|
71
|
+
COURSE ||--o{ ENROLLMENT : includes
|
|
72
|
+
|
|
73
|
+
%% Optional Relationships
|
|
74
|
+
EMPLOYEE |o--o{ DEPARTMENT : manages
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### Relationship with Labels
|
|
78
|
+
|
|
79
|
+
```mermaid
|
|
80
|
+
erDiagram
|
|
81
|
+
AUTHOR ||--o{ BOOK : writes
|
|
82
|
+
BOOK }o--|| PUBLISHER : "published by"
|
|
83
|
+
READER }o--o{ BOOK : reads
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
## Data Types
|
|
87
|
+
|
|
88
|
+
Use standard database types:
|
|
89
|
+
- `int`, `bigint`, `smallint`
|
|
90
|
+
- `varchar`, `text`, `char`
|
|
91
|
+
- `decimal`, `float`, `double`
|
|
92
|
+
- `boolean`, `bool`
|
|
93
|
+
- `date`, `datetime`, `timestamp`
|
|
94
|
+
- `json`, `jsonb`
|
|
95
|
+
- `uuid`
|
|
96
|
+
- `blob`, `bytea`
|
|
97
|
+
|
|
98
|
+
## Comprehensive Example: E-Commerce Database
|
|
99
|
+
|
|
100
|
+
```mermaid
|
|
101
|
+
erDiagram
|
|
102
|
+
CUSTOMER ||--o{ ORDER : places
|
|
103
|
+
CUSTOMER ||--o{ REVIEW : writes
|
|
104
|
+
CUSTOMER ||--o{ ADDRESS : has
|
|
105
|
+
ORDER ||--|{ LINE_ITEM : contains
|
|
106
|
+
PRODUCT ||--o{ LINE_ITEM : "ordered in"
|
|
107
|
+
PRODUCT }o--|| CATEGORY : "belongs to"
|
|
108
|
+
PRODUCT ||--o{ REVIEW : receives
|
|
109
|
+
PRODUCT ||--o{ INVENTORY : tracks
|
|
110
|
+
ORDER ||--|| PAYMENT : "paid by"
|
|
111
|
+
ORDER ||--o| SHIPMENT : "shipped via"
|
|
112
|
+
|
|
113
|
+
CUSTOMER {
|
|
114
|
+
uuid id PK
|
|
115
|
+
varchar email UK "NOT NULL"
|
|
116
|
+
varchar name "NOT NULL"
|
|
117
|
+
varchar phone
|
|
118
|
+
timestamp created_at "DEFAULT NOW()"
|
|
119
|
+
timestamp updated_at
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
ADDRESS {
|
|
123
|
+
uuid id PK
|
|
124
|
+
uuid customer_id FK
|
|
125
|
+
varchar street "NOT NULL"
|
|
126
|
+
varchar city "NOT NULL"
|
|
127
|
+
varchar state
|
|
128
|
+
varchar postal_code
|
|
129
|
+
varchar country "NOT NULL"
|
|
130
|
+
boolean is_default
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
ORDER {
|
|
134
|
+
uuid id PK
|
|
135
|
+
uuid customer_id FK "NOT NULL"
|
|
136
|
+
decimal total "NOT NULL"
|
|
137
|
+
varchar status "NOT NULL"
|
|
138
|
+
timestamp order_date "DEFAULT NOW()"
|
|
139
|
+
timestamp shipped_date
|
|
140
|
+
timestamp delivered_date
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
LINE_ITEM {
|
|
144
|
+
uuid id PK
|
|
145
|
+
uuid order_id FK "NOT NULL"
|
|
146
|
+
uuid product_id FK "NOT NULL"
|
|
147
|
+
int quantity "NOT NULL"
|
|
148
|
+
decimal price_per_unit "NOT NULL"
|
|
149
|
+
decimal subtotal "COMPUTED"
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
PRODUCT {
|
|
153
|
+
uuid id PK
|
|
154
|
+
varchar sku UK "NOT NULL"
|
|
155
|
+
varchar name "NOT NULL"
|
|
156
|
+
text description
|
|
157
|
+
decimal price "NOT NULL"
|
|
158
|
+
uuid category_id FK
|
|
159
|
+
boolean is_active "DEFAULT TRUE"
|
|
160
|
+
timestamp created_at "DEFAULT NOW()"
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
CATEGORY {
|
|
164
|
+
uuid id PK
|
|
165
|
+
varchar name UK "NOT NULL"
|
|
166
|
+
text description
|
|
167
|
+
uuid parent_category_id FK
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
INVENTORY {
|
|
171
|
+
uuid id PK
|
|
172
|
+
uuid product_id FK "NOT NULL"
|
|
173
|
+
int quantity "DEFAULT 0"
|
|
174
|
+
varchar warehouse_location
|
|
175
|
+
timestamp last_updated
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
REVIEW {
|
|
179
|
+
uuid id PK
|
|
180
|
+
uuid customer_id FK "NOT NULL"
|
|
181
|
+
uuid product_id FK "NOT NULL"
|
|
182
|
+
int rating "CHECK 1-5"
|
|
183
|
+
text comment
|
|
184
|
+
timestamp created_at "DEFAULT NOW()"
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
PAYMENT {
|
|
188
|
+
uuid id PK
|
|
189
|
+
uuid order_id FK "NOT NULL"
|
|
190
|
+
varchar payment_method "NOT NULL"
|
|
191
|
+
decimal amount "NOT NULL"
|
|
192
|
+
varchar status "NOT NULL"
|
|
193
|
+
varchar transaction_id UK
|
|
194
|
+
timestamp processed_at
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
SHIPMENT {
|
|
198
|
+
uuid id PK
|
|
199
|
+
uuid order_id FK "NOT NULL"
|
|
200
|
+
varchar carrier
|
|
201
|
+
varchar tracking_number
|
|
202
|
+
timestamp shipped_date
|
|
203
|
+
timestamp estimated_delivery
|
|
204
|
+
timestamp actual_delivery
|
|
205
|
+
}
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
## Blog Platform Schema
|
|
209
|
+
|
|
210
|
+
```mermaid
|
|
211
|
+
erDiagram
|
|
212
|
+
USER ||--o{ POST : creates
|
|
213
|
+
USER ||--o{ COMMENT : writes
|
|
214
|
+
POST ||--o{ COMMENT : receives
|
|
215
|
+
POST }o--o{ TAG : tagged_with
|
|
216
|
+
POST ||--o{ POST_TAG : has
|
|
217
|
+
TAG ||--o{ POST_TAG : applied_to
|
|
218
|
+
POST }o--|| CATEGORY : "belongs to"
|
|
219
|
+
USER ||--o{ LIKE : gives
|
|
220
|
+
POST ||--o{ LIKE : receives
|
|
221
|
+
COMMENT ||--o{ LIKE : receives
|
|
222
|
+
|
|
223
|
+
USER {
|
|
224
|
+
bigint id PK "AUTO_INCREMENT"
|
|
225
|
+
varchar email UK "NOT NULL"
|
|
226
|
+
varchar username UK "NOT NULL"
|
|
227
|
+
varchar password_hash "NOT NULL"
|
|
228
|
+
varchar display_name
|
|
229
|
+
text bio
|
|
230
|
+
varchar avatar_url
|
|
231
|
+
timestamp created_at "DEFAULT NOW()"
|
|
232
|
+
timestamp last_login
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
POST {
|
|
236
|
+
bigint id PK "AUTO_INCREMENT"
|
|
237
|
+
bigint user_id FK "NOT NULL"
|
|
238
|
+
bigint category_id FK
|
|
239
|
+
varchar title "NOT NULL"
|
|
240
|
+
varchar slug UK "NOT NULL"
|
|
241
|
+
text content "NOT NULL"
|
|
242
|
+
text excerpt
|
|
243
|
+
varchar featured_image_url
|
|
244
|
+
varchar status "NOT NULL DEFAULT 'draft'"
|
|
245
|
+
int view_count "DEFAULT 0"
|
|
246
|
+
timestamp published_at
|
|
247
|
+
timestamp created_at "DEFAULT NOW()"
|
|
248
|
+
timestamp updated_at
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
COMMENT {
|
|
252
|
+
bigint id PK "AUTO_INCREMENT"
|
|
253
|
+
bigint user_id FK "NOT NULL"
|
|
254
|
+
bigint post_id FK "NOT NULL"
|
|
255
|
+
bigint parent_comment_id FK "NULL"
|
|
256
|
+
text content "NOT NULL"
|
|
257
|
+
varchar status "DEFAULT 'pending'"
|
|
258
|
+
timestamp created_at "DEFAULT NOW()"
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
CATEGORY {
|
|
262
|
+
bigint id PK "AUTO_INCREMENT"
|
|
263
|
+
varchar name UK "NOT NULL"
|
|
264
|
+
varchar slug UK "NOT NULL"
|
|
265
|
+
text description
|
|
266
|
+
bigint parent_id FK
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
TAG {
|
|
270
|
+
bigint id PK "AUTO_INCREMENT"
|
|
271
|
+
varchar name UK "NOT NULL"
|
|
272
|
+
varchar slug UK "NOT NULL"
|
|
273
|
+
}
|
|
274
|
+
|
|
275
|
+
POST_TAG {
|
|
276
|
+
bigint post_id FK "NOT NULL"
|
|
277
|
+
bigint tag_id FK "NOT NULL"
|
|
278
|
+
}
|
|
279
|
+
|
|
280
|
+
LIKE {
|
|
281
|
+
bigint id PK "AUTO_INCREMENT"
|
|
282
|
+
bigint user_id FK "NOT NULL"
|
|
283
|
+
varchar likeable_type "NOT NULL"
|
|
284
|
+
bigint likeable_id "NOT NULL"
|
|
285
|
+
timestamp created_at "DEFAULT NOW()"
|
|
286
|
+
}
|
|
287
|
+
```
|
|
288
|
+
|
|
289
|
+
## Social Media Schema
|
|
290
|
+
|
|
291
|
+
```mermaid
|
|
292
|
+
erDiagram
|
|
293
|
+
USER ||--o{ POST : creates
|
|
294
|
+
USER ||--o{ FOLLOW : follows
|
|
295
|
+
USER ||--o{ FOLLOW : "followed by"
|
|
296
|
+
POST ||--o{ LIKE : receives
|
|
297
|
+
POST ||--o{ COMMENT : has
|
|
298
|
+
USER ||--o{ LIKE : gives
|
|
299
|
+
USER ||--o{ COMMENT : makes
|
|
300
|
+
USER ||--o{ NOTIFICATION : receives
|
|
301
|
+
POST ||--o{ POST_MEDIA : contains
|
|
302
|
+
USER }o--o{ GROUP : "member of"
|
|
303
|
+
USER ||--o{ MESSAGE : sends
|
|
304
|
+
USER ||--o{ MESSAGE : receives
|
|
305
|
+
|
|
306
|
+
USER {
|
|
307
|
+
uuid id PK
|
|
308
|
+
varchar username UK "NOT NULL"
|
|
309
|
+
varchar email UK "NOT NULL"
|
|
310
|
+
varchar password_hash "NOT NULL"
|
|
311
|
+
varchar full_name
|
|
312
|
+
text bio
|
|
313
|
+
varchar profile_picture_url
|
|
314
|
+
varchar cover_photo_url
|
|
315
|
+
boolean is_verified "DEFAULT FALSE"
|
|
316
|
+
boolean is_private "DEFAULT FALSE"
|
|
317
|
+
timestamp created_at "DEFAULT NOW()"
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
POST {
|
|
321
|
+
uuid id PK
|
|
322
|
+
uuid user_id FK "NOT NULL"
|
|
323
|
+
text content
|
|
324
|
+
varchar visibility "DEFAULT 'public'"
|
|
325
|
+
int likes_count "DEFAULT 0"
|
|
326
|
+
int comments_count "DEFAULT 0"
|
|
327
|
+
int shares_count "DEFAULT 0"
|
|
328
|
+
timestamp created_at "DEFAULT NOW()"
|
|
329
|
+
timestamp edited_at
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
POST_MEDIA {
|
|
333
|
+
uuid id PK
|
|
334
|
+
uuid post_id FK "NOT NULL"
|
|
335
|
+
varchar media_type "NOT NULL"
|
|
336
|
+
varchar media_url "NOT NULL"
|
|
337
|
+
int display_order
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
FOLLOW {
|
|
341
|
+
uuid id PK
|
|
342
|
+
uuid follower_id FK "NOT NULL"
|
|
343
|
+
uuid following_id FK "NOT NULL"
|
|
344
|
+
timestamp created_at "DEFAULT NOW()"
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
LIKE {
|
|
348
|
+
uuid id PK
|
|
349
|
+
uuid user_id FK "NOT NULL"
|
|
350
|
+
uuid post_id FK "NOT NULL"
|
|
351
|
+
timestamp created_at "DEFAULT NOW()"
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
COMMENT {
|
|
355
|
+
uuid id PK
|
|
356
|
+
uuid user_id FK "NOT NULL"
|
|
357
|
+
uuid post_id FK "NOT NULL"
|
|
358
|
+
uuid parent_comment_id FK
|
|
359
|
+
text content "NOT NULL"
|
|
360
|
+
int likes_count "DEFAULT 0"
|
|
361
|
+
timestamp created_at "DEFAULT NOW()"
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
MESSAGE {
|
|
365
|
+
uuid id PK
|
|
366
|
+
uuid sender_id FK "NOT NULL"
|
|
367
|
+
uuid receiver_id FK "NOT NULL"
|
|
368
|
+
text content "NOT NULL"
|
|
369
|
+
boolean is_read "DEFAULT FALSE"
|
|
370
|
+
timestamp created_at "DEFAULT NOW()"
|
|
371
|
+
timestamp read_at
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
NOTIFICATION {
|
|
375
|
+
uuid id PK
|
|
376
|
+
uuid user_id FK "NOT NULL"
|
|
377
|
+
varchar notification_type "NOT NULL"
|
|
378
|
+
text content "NOT NULL"
|
|
379
|
+
boolean is_read "DEFAULT FALSE"
|
|
380
|
+
varchar related_entity_type
|
|
381
|
+
uuid related_entity_id
|
|
382
|
+
timestamp created_at "DEFAULT NOW()"
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
GROUP {
|
|
386
|
+
uuid id PK
|
|
387
|
+
varchar name "NOT NULL"
|
|
388
|
+
text description
|
|
389
|
+
uuid created_by FK "NOT NULL"
|
|
390
|
+
boolean is_private "DEFAULT FALSE"
|
|
391
|
+
timestamp created_at "DEFAULT NOW()"
|
|
392
|
+
}
|
|
393
|
+
```
|
|
394
|
+
|
|
395
|
+
## Best Practices
|
|
396
|
+
|
|
397
|
+
1. **Name entities in UPPERCASE** - Convention for clarity
|
|
398
|
+
2. **Use singular names** - `USER` not `USERS`, `ORDER` not `ORDERS`
|
|
399
|
+
3. **Define all constraints** - Document PKs, FKs, UKs, NOT NULL
|
|
400
|
+
4. **Show cardinality accurately** - Be precise about one-to-many vs many-to-many
|
|
401
|
+
5. **Include timestamps** - created_at, updated_at for auditing
|
|
402
|
+
6. **Document computed columns** - Mark calculated/derived values
|
|
403
|
+
7. **Add meaningful comments** - Use quotes for constraints and descriptions
|
|
404
|
+
8. **Consider junction tables** - Explicitly model many-to-many relationships
|
|
405
|
+
9. **Use appropriate types** - Match database-specific types
|
|
406
|
+
10. **Show indexes** - Document UK (unique keys) beyond PKs
|
|
407
|
+
|
|
408
|
+
## Common Patterns
|
|
409
|
+
|
|
410
|
+
### Self-Referencing (Hierarchical)
|
|
411
|
+
```mermaid
|
|
412
|
+
erDiagram
|
|
413
|
+
CATEGORY ||--o{ CATEGORY : "parent of"
|
|
414
|
+
|
|
415
|
+
CATEGORY {
|
|
416
|
+
uuid id PK
|
|
417
|
+
varchar name "NOT NULL"
|
|
418
|
+
uuid parent_id FK "NULLABLE"
|
|
419
|
+
}
|
|
420
|
+
```
|
|
421
|
+
|
|
422
|
+
### Junction Table (Many-to-Many)
|
|
423
|
+
```mermaid
|
|
424
|
+
erDiagram
|
|
425
|
+
STUDENT }o--o{ COURSE : enrolls
|
|
426
|
+
STUDENT ||--o{ ENROLLMENT : has
|
|
427
|
+
COURSE ||--o{ ENROLLMENT : includes
|
|
428
|
+
|
|
429
|
+
STUDENT {
|
|
430
|
+
uuid id PK
|
|
431
|
+
varchar name "NOT NULL"
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
ENROLLMENT {
|
|
435
|
+
uuid student_id FK PK
|
|
436
|
+
uuid course_id FK PK
|
|
437
|
+
date enrolled_date
|
|
438
|
+
varchar grade
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
COURSE {
|
|
442
|
+
uuid id PK
|
|
443
|
+
varchar title "NOT NULL"
|
|
444
|
+
}
|
|
445
|
+
```
|
|
446
|
+
|
|
447
|
+
### Polymorphic Relationship
|
|
448
|
+
```mermaid
|
|
449
|
+
erDiagram
|
|
450
|
+
COMMENT {
|
|
451
|
+
uuid id PK
|
|
452
|
+
uuid user_id FK
|
|
453
|
+
varchar commentable_type "NOT NULL"
|
|
454
|
+
uuid commentable_id "NOT NULL"
|
|
455
|
+
text content
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
POST {
|
|
459
|
+
uuid id PK
|
|
460
|
+
varchar title
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
VIDEO {
|
|
464
|
+
uuid id PK
|
|
465
|
+
varchar title
|
|
466
|
+
}
|
|
467
|
+
```
|
|
468
|
+
|
|
469
|
+
### Soft Deletes
|
|
470
|
+
```mermaid
|
|
471
|
+
erDiagram
|
|
472
|
+
USER {
|
|
473
|
+
uuid id PK
|
|
474
|
+
varchar email UK
|
|
475
|
+
varchar name
|
|
476
|
+
timestamp deleted_at "NULLABLE"
|
|
477
|
+
}
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
### Audit Trail
|
|
481
|
+
```mermaid
|
|
482
|
+
erDiagram
|
|
483
|
+
DOCUMENT ||--o{ DOCUMENT_VERSION : has
|
|
484
|
+
|
|
485
|
+
DOCUMENT {
|
|
486
|
+
uuid id PK
|
|
487
|
+
varchar title "NOT NULL"
|
|
488
|
+
int current_version "DEFAULT 1"
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
DOCUMENT_VERSION {
|
|
492
|
+
uuid id PK
|
|
493
|
+
uuid document_id FK "NOT NULL"
|
|
494
|
+
int version_number "NOT NULL"
|
|
495
|
+
text content "NOT NULL"
|
|
496
|
+
uuid modified_by FK
|
|
497
|
+
timestamp created_at "DEFAULT NOW()"
|
|
498
|
+
}
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
## Tips for Database Design
|
|
502
|
+
|
|
503
|
+
1. **Normalize appropriately** - Balance normalization with query performance
|
|
504
|
+
2. **Use surrogate keys** - UUID or auto-increment integers as PKs
|
|
505
|
+
3. **Index foreign keys** - Essential for join performance
|
|
506
|
+
4. **Plan for soft deletes** - Add deleted_at columns instead of hard deletes
|
|
507
|
+
5. **Version critical data** - Maintain history for important entities
|
|
508
|
+
6. **Set appropriate defaults** - created_at, status, boolean flags
|
|
509
|
+
7. **Consider denormalization** - Counts and cached values for performance
|
|
510
|
+
8. **Use enum/check constraints** - Enforce valid values at database level
|