@sylix/coworker 2.0.10 → 2.0.12
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/dist/commands/slash/config.d.ts.map +1 -1
- package/dist/commands/slash/config.js +23 -5
- package/dist/commands/slash/config.js.map +1 -1
- package/dist/commands/slash/todo.js +1 -1
- package/dist/commands/slash/todo.js.map +1 -1
- package/dist/core/CoWorkerAgent.d.ts.map +1 -1
- package/dist/core/CoWorkerAgent.js +6 -3
- package/dist/core/CoWorkerAgent.js.map +1 -1
- package/dist/permissions/PermissionInterceptor.js +1 -1
- package/dist/permissions/PermissionInterceptor.js.map +1 -1
- package/dist/skills/defaults/accessibility/screen-reader-testing.md +545 -0
- package/dist/skills/defaults/accessibility/wcag-audit-patterns.md +555 -0
- package/dist/skills/defaults/ai-ml/rag.md +276 -0
- package/dist/skills/defaults/backend-development/api-design-principles.md +528 -0
- package/dist/skills/defaults/backend-development/api-design.md +285 -0
- package/dist/skills/defaults/backend-development/architecture-patterns.md +494 -0
- package/dist/skills/defaults/backend-development/async-python.md +237 -0
- package/dist/skills/defaults/backend-development/auth-implementation-patterns.md +638 -0
- package/dist/skills/defaults/backend-development/bazel-build-optimization.md +387 -0
- package/dist/skills/defaults/backend-development/billing-automation/SKILL.md +566 -0
- package/dist/skills/defaults/backend-development/code-review-excellence.md +538 -0
- package/dist/skills/defaults/backend-development/cqrs-implementation.md +554 -0
- package/dist/skills/defaults/backend-development/database-design.md +305 -0
- package/dist/skills/defaults/backend-development/debugging-strategies.md +536 -0
- package/dist/skills/defaults/backend-development/e2e-testing-patterns.md +544 -0
- package/dist/skills/defaults/backend-development/error-handling-patterns.md +641 -0
- package/dist/skills/defaults/backend-development/fastapi-templates.md +559 -0
- package/dist/skills/defaults/backend-development/fastapi.md +309 -0
- package/dist/skills/defaults/backend-development/git-advanced-workflows.md +405 -0
- package/dist/skills/defaults/backend-development/microservices-patterns.md +595 -0
- package/dist/skills/defaults/backend-development/microservices.md +284 -0
- package/dist/skills/defaults/backend-development/monorepo-management.md +623 -0
- package/dist/skills/defaults/backend-development/nodejs-backend-patterns.md +1048 -0
- package/dist/skills/defaults/backend-development/nx-workspace-patterns.md +457 -0
- package/dist/skills/defaults/backend-development/paypal-integration/SKILL.md +478 -0
- package/dist/skills/defaults/backend-development/pci-compliance/SKILL.md +480 -0
- package/dist/skills/defaults/backend-development/python-anti-patterns.md +349 -0
- package/dist/skills/defaults/backend-development/python-background-jobs.md +364 -0
- package/dist/skills/defaults/backend-development/python-code-style.md +360 -0
- package/dist/skills/defaults/backend-development/python-configuration.md +368 -0
- package/dist/skills/defaults/backend-development/python-design-patterns.md +296 -0
- package/dist/skills/defaults/backend-development/python-error-handling.md +323 -0
- package/dist/skills/defaults/backend-development/python-packaging.md +887 -0
- package/dist/skills/defaults/backend-development/python-performance-optimization.md +874 -0
- package/dist/skills/defaults/backend-development/python-project-structure.md +252 -0
- package/dist/skills/defaults/backend-development/python-resilience.md +376 -0
- package/dist/skills/defaults/backend-development/python-resource-management.md +421 -0
- package/dist/skills/defaults/backend-development/python-type-safety.md +428 -0
- package/dist/skills/defaults/backend-development/sql-optimization-patterns.md +509 -0
- package/dist/skills/defaults/backend-development/stripe-integration/SKILL.md +522 -0
- package/dist/skills/defaults/backend-development/turborepo-caching.md +376 -0
- package/dist/skills/defaults/blockchain/defi-protocol-templates.md +430 -0
- package/dist/skills/defaults/blockchain/nft-standards.md +364 -0
- package/dist/skills/defaults/blockchain/solidity-security.md +514 -0
- package/dist/skills/defaults/blockchain/web3-testing.md +360 -0
- package/dist/skills/defaults/business/competitive-landscape/SKILL.md +527 -0
- package/dist/skills/defaults/business/market-sizing-analysis/SKILL.md +451 -0
- package/dist/skills/defaults/business/startup-financial-modeling/SKILL.md +494 -0
- package/dist/skills/defaults/business/startup-metrics-framework/SKILL.md +564 -0
- package/dist/skills/defaults/business/team-composition-analysis.md +437 -0
- package/dist/skills/defaults/compliance/employment-contract-templates/SKILL.md +527 -0
- package/dist/skills/defaults/compliance/gdpr-data-handling/SKILL.md +630 -0
- package/dist/skills/defaults/data-engineering/airflow-dag-patterns.md +436 -0
- package/dist/skills/defaults/data-engineering/airflow.md +519 -0
- package/dist/skills/defaults/data-engineering/data-quality.md +583 -0
- package/dist/skills/defaults/data-engineering/dbt-transformation-patterns.md +482 -0
- package/dist/skills/defaults/data-engineering/dbt.md +556 -0
- package/dist/skills/defaults/data-engineering/ml-pipeline-workflow/SKILL.md +247 -0
- package/dist/skills/defaults/data-engineering/spark-optimization.md +348 -0
- package/dist/skills/defaults/data-engineering/spark.md +411 -0
- package/dist/skills/defaults/database/postgresql.md +202 -0
- package/dist/skills/defaults/debugging/systematic-debugging.md +249 -0
- package/dist/skills/defaults/devops/architecture-decision-records.md +448 -0
- package/dist/skills/defaults/devops/changelog-automation.md +580 -0
- package/dist/skills/defaults/devops/cicd.md +314 -0
- package/dist/skills/defaults/devops/cloud.md +263 -0
- package/dist/skills/defaults/devops/code-review-excellence.md +299 -0
- package/dist/skills/defaults/devops/cost-optimization.md +295 -0
- package/dist/skills/defaults/devops/deployment-pipeline-design.md +356 -0
- package/dist/skills/defaults/devops/docker.md +281 -0
- package/dist/skills/defaults/devops/git-workflows.md +205 -0
- package/dist/skills/defaults/devops/github-actions.md +311 -0
- package/dist/skills/defaults/devops/gitlab-ci-patterns.md +266 -0
- package/dist/skills/defaults/devops/hybrid-cloud-networking.md +241 -0
- package/dist/skills/defaults/devops/istio-traffic-management.md +327 -0
- package/dist/skills/defaults/devops/kubernetes.md +339 -0
- package/dist/skills/defaults/devops/linkerd-patterns.md +311 -0
- package/dist/skills/defaults/devops/multi-cloud-architecture.md +181 -0
- package/dist/skills/defaults/devops/observability.md +243 -0
- package/dist/skills/defaults/devops/openapi-spec-generation.md +1024 -0
- package/dist/skills/defaults/devops/postmortem-writing.md +396 -0
- package/dist/skills/defaults/devops/prometheus-configuration.md +265 -0
- package/dist/skills/defaults/devops/secrets-management.md +341 -0
- package/dist/skills/defaults/devops/service-mesh-observability.md +385 -0
- package/dist/skills/defaults/devops/terraform-module-library.md +244 -0
- package/dist/skills/defaults/finance/backtesting-frameworks/SKILL.md +663 -0
- package/dist/skills/defaults/finance/risk-metrics-calculation/SKILL.md +557 -0
- package/dist/skills/defaults/frontend/accessibility-compliance.md +420 -0
- package/dist/skills/defaults/frontend/design-system-patterns.md +337 -0
- package/dist/skills/defaults/frontend/interaction-design.md +327 -0
- package/dist/skills/defaults/frontend/javascript.md +311 -0
- package/dist/skills/defaults/frontend/modern-javascript-patterns.md +927 -0
- package/dist/skills/defaults/frontend/react-native-design.md +440 -0
- package/dist/skills/defaults/frontend/react.md +345 -0
- package/dist/skills/defaults/frontend/responsive-design.md +472 -0
- package/dist/skills/defaults/frontend/tailwind-design-system.md +337 -0
- package/dist/skills/defaults/frontend/typescript-advanced-types.md +724 -0
- package/dist/skills/defaults/frontend/typescript.md +334 -0
- package/dist/skills/defaults/frontend/visual-design-foundations.md +326 -0
- package/dist/skills/defaults/frontend/web-component-design.md +279 -0
- package/dist/skills/defaults/game-development/godot-gdscript-patterns.md +188 -0
- package/dist/skills/defaults/game-development/unity-ecs-patterns.md +594 -0
- package/dist/skills/defaults/kubernetes/gitops-workflow.md +285 -0
- package/dist/skills/defaults/kubernetes/gitops.md +280 -0
- package/dist/skills/defaults/kubernetes/helm-chart-scaffolding.md +553 -0
- package/dist/skills/defaults/kubernetes/helm.md +343 -0
- package/dist/skills/defaults/kubernetes/k8s-manifest-generator.md +501 -0
- package/dist/skills/defaults/kubernetes/k8s-security-policies.md +342 -0
- package/dist/skills/defaults/kubernetes/manifests.md +330 -0
- package/dist/skills/defaults/kubernetes/security.md +337 -0
- package/dist/skills/defaults/llm-application/embedding-strategies.md +608 -0
- package/dist/skills/defaults/llm-application/hybrid-search-implementation.md +570 -0
- package/dist/skills/defaults/llm-application/hybrid-search.md +570 -0
- package/dist/skills/defaults/llm-application/langchain-architecture.md +666 -0
- package/dist/skills/defaults/llm-application/langchain.md +259 -0
- package/dist/skills/defaults/llm-application/llm-evaluation.md +695 -0
- package/dist/skills/defaults/llm-application/prompt-engineering-patterns.md +449 -0
- package/dist/skills/defaults/llm-application/prompt-engineering.md +219 -0
- package/dist/skills/defaults/llm-application/rag-implementation.md +434 -0
- package/dist/skills/defaults/llm-application/similarity-search-patterns.md +560 -0
- package/dist/skills/defaults/llm-application/similarity-search.md +560 -0
- package/dist/skills/defaults/llm-application/vector-index-tuning.md +523 -0
- package/dist/skills/defaults/mobile/mobile-android-design.md +440 -0
- package/dist/skills/defaults/mobile/mobile-ios-design.md +266 -0
- package/dist/skills/defaults/monitoring/distributed-tracing.md +436 -0
- package/dist/skills/defaults/monitoring/grafana-dashboards.md +370 -0
- package/dist/skills/defaults/monitoring/prometheus-configuration.md +379 -0
- package/dist/skills/defaults/monitoring/slo-implementation.md +323 -0
- package/dist/skills/defaults/refactoring/code-refactoring.md +349 -0
- package/dist/skills/defaults/security/anti-reversing-techniques/SKILL.md +559 -0
- package/dist/skills/defaults/security/auditor.md +168 -0
- package/dist/skills/defaults/security/binary-analysis-patterns/SKILL.md +438 -0
- package/dist/skills/defaults/security/memory-forensics/SKILL.md +483 -0
- package/dist/skills/defaults/security/mtls-configuration.md +349 -0
- package/dist/skills/defaults/security/protocol-reverse-engineering/SKILL.md +520 -0
- package/dist/skills/defaults/security/sast-configuration.md +182 -0
- package/dist/skills/defaults/security/security.md +313 -0
- package/dist/skills/defaults/security/stride-analysis.md +273 -0
- package/dist/skills/defaults/security/threat-mitigation-mapping.md +290 -0
- package/dist/skills/defaults/systems/bash-defensive-patterns/SKILL.md +539 -0
- package/dist/skills/defaults/systems/bats-testing-patterns/SKILL.md +631 -0
- package/dist/skills/defaults/systems/go-concurrency-patterns.md +657 -0
- package/dist/skills/defaults/systems/memory-safety-patterns.md +605 -0
- package/dist/skills/defaults/systems/rust-async-patterns.md +519 -0
- package/dist/skills/defaults/systems/shellcheck-configuration/SKILL.md +456 -0
- package/dist/skills/defaults/team-collaboration/multi-reviewer-patterns.md +126 -0
- package/dist/skills/defaults/team-collaboration/parallel-feature-development.md +151 -0
- package/dist/skills/defaults/testing/javascript-testing-patterns.md +1021 -0
- package/dist/skills/defaults/testing/python-testing-patterns.md +351 -0
- package/dist/skills/defaults/testing/testing.md +332 -0
- package/dist/skills/defaults/workflows/context-driven-development.md +384 -0
- package/dist/skills/defaults/workflows/track-management.md +592 -0
- package/dist/skills/defaults/workflows/workflow-patterns.md +622 -0
- package/dist/skills/index.d.ts +11 -0
- package/dist/skills/index.d.ts.map +1 -0
- package/dist/skills/index.js +129 -0
- package/dist/skills/index.js.map +1 -0
- package/dist/utils/character.js +6 -9
- package/dist/utils/character.js.map +1 -1
- package/dist/utils/contextManager.js +3 -7
- package/dist/utils/contextManager.js.map +1 -1
- package/dist/utils/inputbar.d.ts.map +1 -1
- package/dist/utils/inputbar.js +8 -1
- package/dist/utils/inputbar.js.map +1 -1
- package/dist/utils/output.d.ts.map +1 -1
- package/dist/utils/output.js +3 -35
- package/dist/utils/output.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,305 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: database-design
|
|
3
|
+
description: Design efficient, scalable database schemas with normalization, indexing, and performance optimization.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Database Design — CoWorker Edition
|
|
7
|
+
|
|
8
|
+
Build robust data models that scale. These principles apply to PostgreSQL, MySQL, and most relational databases.
|
|
9
|
+
|
|
10
|
+
## When to Use This Skill
|
|
11
|
+
|
|
12
|
+
- Designing new database schemas
|
|
13
|
+
- Normalizing or denormalizing existing schemas
|
|
14
|
+
- Optimizing query performance
|
|
15
|
+
- Choosing data types
|
|
16
|
+
- Implementing relationships
|
|
17
|
+
|
|
18
|
+
## Core Concepts
|
|
19
|
+
|
|
20
|
+
### 1. Normalization
|
|
21
|
+
|
|
22
|
+
**First Normal Form (1NF):**
|
|
23
|
+
- Atomic values (no arrays in columns)
|
|
24
|
+
- No repeated groups
|
|
25
|
+
- Each row unique
|
|
26
|
+
|
|
27
|
+
```sql
|
|
28
|
+
-- Bad: Repeating groups
|
|
29
|
+
CREATE TABLE orders_bad (
|
|
30
|
+
id INT,
|
|
31
|
+
item1 VARCHAR(100),
|
|
32
|
+
item2 VARCHAR(100),
|
|
33
|
+
item3 VARCHAR(100)
|
|
34
|
+
);
|
|
35
|
+
|
|
36
|
+
-- Good: Atomic values
|
|
37
|
+
CREATE TABLE orders (
|
|
38
|
+
id INT PRIMARY KEY,
|
|
39
|
+
customer_id INT,
|
|
40
|
+
order_date DATE
|
|
41
|
+
);
|
|
42
|
+
|
|
43
|
+
CREATE TABLE order_items (
|
|
44
|
+
id INT PRIMARY KEY,
|
|
45
|
+
order_id INT REFERENCES orders(id),
|
|
46
|
+
product_id INT,
|
|
47
|
+
quantity INT
|
|
48
|
+
);
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
**Second Normal Form (2NF):**
|
|
52
|
+
- 1NF + No partial dependencies
|
|
53
|
+
- Non-key columns depend on entire primary key
|
|
54
|
+
|
|
55
|
+
```sql
|
|
56
|
+
-- Bad: Partial dependency
|
|
57
|
+
CREATE TABLE order_items_bad (
|
|
58
|
+
order_id INT,
|
|
59
|
+
product_id INT, -- Part of PK
|
|
60
|
+
product_name VARCHAR(100), -- Depends only on product_id
|
|
61
|
+
quantity INT,
|
|
62
|
+
PRIMARY KEY (order_id, product_id)
|
|
63
|
+
);
|
|
64
|
+
|
|
65
|
+
-- Good: Separate tables
|
|
66
|
+
CREATE TABLE products (
|
|
67
|
+
id INT PRIMARY KEY,
|
|
68
|
+
name VARCHAR(100)
|
|
69
|
+
);
|
|
70
|
+
|
|
71
|
+
CREATE TABLE order_items (
|
|
72
|
+
order_id INT REFERENCES orders(id),
|
|
73
|
+
product_id INT REFERENCES products(id),
|
|
74
|
+
quantity INT,
|
|
75
|
+
PRIMARY KEY (order_id, product_id)
|
|
76
|
+
);
|
|
77
|
+
```
|
|
78
|
+
|
|
79
|
+
**Third Normal Form (3NF):**
|
|
80
|
+
- 2NF + No transitive dependencies
|
|
81
|
+
- Non-key columns depend only on primary key
|
|
82
|
+
|
|
83
|
+
```sql
|
|
84
|
+
-- Bad: Transitive dependency
|
|
85
|
+
CREATE TABLE orders_bad (
|
|
86
|
+
id INT PRIMARY KEY,
|
|
87
|
+
customer_id INT,
|
|
88
|
+
customer_city VARCHAR(100), -- Depends on customer_id, not order
|
|
89
|
+
customer_zip VARCHAR(10)
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
-- Good: Separate customer info
|
|
93
|
+
CREATE TABLE customers (
|
|
94
|
+
id INT PRIMARY KEY,
|
|
95
|
+
city VARCHAR(100),
|
|
96
|
+
zip VARCHAR(10)
|
|
97
|
+
);
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
### 2. Indexing Strategies
|
|
101
|
+
|
|
102
|
+
```sql
|
|
103
|
+
-- Single column index
|
|
104
|
+
CREATE INDEX idx_orders_customer ON orders(customer_id);
|
|
105
|
+
|
|
106
|
+
-- Composite index (order matters!)
|
|
107
|
+
-- For: WHERE status = 'pending' AND created_at > '2024-01-01'
|
|
108
|
+
CREATE INDEX idx_orders_status_date ON orders(status, created_at);
|
|
109
|
+
|
|
110
|
+
-- Partial index (only active records)
|
|
111
|
+
CREATE INDEX idx_active_orders ON orders(customer_id)
|
|
112
|
+
WHERE status = 'active';
|
|
113
|
+
|
|
114
|
+
-- Unique index
|
|
115
|
+
CREATE UNIQUE INDEX idx_users_email ON users(email);
|
|
116
|
+
|
|
117
|
+
-- Covering index (includes all queried columns)
|
|
118
|
+
CREATE INDEX idx_orders_cover ON orders(customer_id, status, created_at)
|
|
119
|
+
INCLUDE (total_amount);
|
|
120
|
+
```
|
|
121
|
+
|
|
122
|
+
### 3. Data Types
|
|
123
|
+
|
|
124
|
+
```sql
|
|
125
|
+
-- Use appropriate types
|
|
126
|
+
-- Dates
|
|
127
|
+
created_at TIMESTAMP WITH TIME ZONE -- For logs, records
|
|
128
|
+
birth_date DATE -- For dates without time
|
|
129
|
+
|
|
130
|
+
-- Strings
|
|
131
|
+
username VARCHAR(50) -- Bounded
|
|
132
|
+
bio TEXT -- Unbounded
|
|
133
|
+
country_code CHAR(2) -- Fixed length
|
|
134
|
+
|
|
135
|
+
-- Numbers
|
|
136
|
+
quantity INT -- Whole numbers
|
|
137
|
+
price DECIMAL(10, 2) -- Exact precision for money
|
|
138
|
+
latitude DECIMAL(9, 6) -- Coordinates
|
|
139
|
+
|
|
140
|
+
-- UUID vs Integer
|
|
141
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid() -- Distributed systems
|
|
142
|
+
id SERIAL PRIMARY KEY -- Single database
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### 4. Relationships
|
|
146
|
+
|
|
147
|
+
```sql
|
|
148
|
+
-- One-to-One
|
|
149
|
+
CREATE TABLE users (
|
|
150
|
+
id SERIAL PRIMARY KEY,
|
|
151
|
+
email VARCHAR(255) UNIQUE
|
|
152
|
+
);
|
|
153
|
+
|
|
154
|
+
CREATE TABLE user_profiles (
|
|
155
|
+
user_id INT PRIMARY KEY REFERENCES users(id),
|
|
156
|
+
bio TEXT,
|
|
157
|
+
avatar_url VARCHAR(500)
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
-- One-to-Many
|
|
161
|
+
CREATE TABLE customers (
|
|
162
|
+
id SERIAL PRIMARY KEY,
|
|
163
|
+
name VARCHAR(255)
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
CREATE TABLE orders (
|
|
167
|
+
id SERIAL PRIMARY KEY,
|
|
168
|
+
customer_id INT REFERENCES customers(id),
|
|
169
|
+
total DECIMAL(10, 2)
|
|
170
|
+
);
|
|
171
|
+
|
|
172
|
+
-- Many-to-Many
|
|
173
|
+
CREATE TABLE students (
|
|
174
|
+
id SERIAL PRIMARY KEY,
|
|
175
|
+
name VARCHAR(255)
|
|
176
|
+
);
|
|
177
|
+
|
|
178
|
+
CREATE TABLE courses (
|
|
179
|
+
id SERIAL PRIMARY KEY,
|
|
180
|
+
name VARCHAR(255)
|
|
181
|
+
);
|
|
182
|
+
|
|
183
|
+
CREATE TABLE enrollments (
|
|
184
|
+
student_id INT REFERENCES students(id),
|
|
185
|
+
course_id INT REFERENCES courses(id),
|
|
186
|
+
enrolled_at TIMESTAMP DEFAULT NOW(),
|
|
187
|
+
PRIMARY KEY (student_id, course_id)
|
|
188
|
+
);
|
|
189
|
+
```
|
|
190
|
+
|
|
191
|
+
### 5. Migrations
|
|
192
|
+
|
|
193
|
+
```python
|
|
194
|
+
# Alembic migration example
|
|
195
|
+
"""add_user_preferences
|
|
196
|
+
|
|
197
|
+
Revision ID: abc123
|
|
198
|
+
Revises:
|
|
199
|
+
Create Date: 2024-01-15 10:00:00
|
|
200
|
+
"""
|
|
201
|
+
from alembic import op
|
|
202
|
+
import sqlalchemy as sa
|
|
203
|
+
|
|
204
|
+
revision = 'abc123'
|
|
205
|
+
down_revision = 'previous_revision'
|
|
206
|
+
branch_labels = None
|
|
207
|
+
depends_on = None
|
|
208
|
+
|
|
209
|
+
def upgrade():
|
|
210
|
+
op.create_table(
|
|
211
|
+
'user_preferences',
|
|
212
|
+
sa.Column('user_id', sa.Integer(), nullable=False),
|
|
213
|
+
sa.Column('theme', sa.String(20), server_default='light'),
|
|
214
|
+
sa.Column('notifications', sa.Boolean(), server_default=True),
|
|
215
|
+
sa.ForeignKeyConstraint(['user_id'], ['users.id']),
|
|
216
|
+
sa.PrimaryKeyConstraint('user_id')
|
|
217
|
+
)
|
|
218
|
+
|
|
219
|
+
# Add index
|
|
220
|
+
op.create_index(
|
|
221
|
+
'idx_preferences_theme',
|
|
222
|
+
'user_preferences',
|
|
223
|
+
['theme']
|
|
224
|
+
)
|
|
225
|
+
|
|
226
|
+
def downgrade():
|
|
227
|
+
op.drop_index('idx_preferences_theme')
|
|
228
|
+
op.drop_table('user_preferences')
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### 6. Query Optimization
|
|
232
|
+
|
|
233
|
+
```python
|
|
234
|
+
# Bad: N+1 queries
|
|
235
|
+
def get_orders_with_users():
|
|
236
|
+
orders = db.query(Order).all()
|
|
237
|
+
for order in orders:
|
|
238
|
+
user = db.query(User).get(order.user_id) # Query per order!
|
|
239
|
+
order.user = user
|
|
240
|
+
return orders
|
|
241
|
+
|
|
242
|
+
# Good: Eager loading
|
|
243
|
+
def get_orders_with_users():
|
|
244
|
+
return db.query(Order).options(
|
|
245
|
+
joinedload(Order.user)
|
|
246
|
+
).all()
|
|
247
|
+
|
|
248
|
+
# Good: Specific columns
|
|
249
|
+
def get_order_summary():
|
|
250
|
+
return db.query(
|
|
251
|
+
Order.id,
|
|
252
|
+
Order.status,
|
|
253
|
+
User.name.label('customer_name')
|
|
254
|
+
).join(User).all()
|
|
255
|
+
```
|
|
256
|
+
|
|
257
|
+
### 7. Transactions
|
|
258
|
+
|
|
259
|
+
```python
|
|
260
|
+
from sqlalchemy import create_engine
|
|
261
|
+
from sqlalchemy.orm import sessionmaker
|
|
262
|
+
|
|
263
|
+
engine = create_engine(DATABASE_URL)
|
|
264
|
+
Session = sessionmaker(bind=engine)
|
|
265
|
+
|
|
266
|
+
def transfer_funds(from_account: int, to_account: int, amount: Decimal):
|
|
267
|
+
session = Session()
|
|
268
|
+
try:
|
|
269
|
+
# Start transaction
|
|
270
|
+
from_acc = session.query(Account).filter_by(id=from_account).with_for_update().first()
|
|
271
|
+
to_acc = session.query(Account).filter_by(id=to_account).with_for_update().first()
|
|
272
|
+
|
|
273
|
+
if from_acc.balance < amount:
|
|
274
|
+
raise InsufficientFundsError()
|
|
275
|
+
|
|
276
|
+
from_acc.balance -= amount
|
|
277
|
+
to_acc.balance += amount
|
|
278
|
+
|
|
279
|
+
session.commit()
|
|
280
|
+
except Exception:
|
|
281
|
+
session.rollback()
|
|
282
|
+
raise
|
|
283
|
+
finally:
|
|
284
|
+
session.close()
|
|
285
|
+
```
|
|
286
|
+
|
|
287
|
+
## Best Practices
|
|
288
|
+
|
|
289
|
+
1. **Start normalized** - Denormalize only for performance
|
|
290
|
+
2. **Index strategically** - Based on actual query patterns
|
|
291
|
+
3. **Use constraints** - NOT NULL, CHECK, UNIQUE, FOREIGN KEY
|
|
292
|
+
4. **Version migrations** - Always use migration tools
|
|
293
|
+
5. **Test migrations** - Run against copy before production
|
|
294
|
+
6. **Document schema** - ERD diagrams, README
|
|
295
|
+
7. **Soft deletes** - Use `deleted_at` for audit trails
|
|
296
|
+
|
|
297
|
+
## Common Pitfalls
|
|
298
|
+
|
|
299
|
+
- Missing foreign key constraints
|
|
300
|
+
- No indexes on foreign keys
|
|
301
|
+
- Storing serialized JSON when columns work
|
|
302
|
+
- Using TEXT for everything
|
|
303
|
+
- Over-normalization (too many joins)
|
|
304
|
+
- No migration strategy
|
|
305
|
+
- Ignoring database-specific features
|