@wazir-dev/cli 1.0.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/AGENTS.md +111 -0
- package/CHANGELOG.md +14 -0
- package/CONTRIBUTING.md +101 -0
- package/LICENSE +21 -0
- package/README.md +314 -0
- package/assets/composition-engine.mmd +34 -0
- package/assets/demo-script.sh +17 -0
- package/assets/logo-dark.svg +14 -0
- package/assets/logo.svg +14 -0
- package/assets/pipeline.mmd +39 -0
- package/assets/record-demo.sh +51 -0
- package/docs/README.md +51 -0
- package/docs/adapters/context-mode.md +60 -0
- package/docs/concepts/architecture.md +87 -0
- package/docs/concepts/artifact-model.md +60 -0
- package/docs/concepts/composition-engine.md +36 -0
- package/docs/concepts/indexing-and-recall.md +160 -0
- package/docs/concepts/observability.md +41 -0
- package/docs/concepts/roles-and-workflows.md +59 -0
- package/docs/concepts/terminology-policy.md +27 -0
- package/docs/getting-started/01-installation.md +78 -0
- package/docs/getting-started/02-first-run.md +102 -0
- package/docs/getting-started/03-adding-to-project.md +15 -0
- package/docs/getting-started/04-host-setup.md +15 -0
- package/docs/guides/ci-integration.md +15 -0
- package/docs/guides/creating-skills.md +15 -0
- package/docs/guides/expertise-module-authoring.md +15 -0
- package/docs/guides/hook-development.md +15 -0
- package/docs/guides/memory-and-learnings.md +34 -0
- package/docs/guides/multi-host-export.md +15 -0
- package/docs/guides/troubleshooting.md +101 -0
- package/docs/guides/writing-custom-roles.md +15 -0
- package/docs/plans/2026-03-15-cli-pipeline-integration-design.md +592 -0
- package/docs/plans/2026-03-15-cli-pipeline-integration-plan.md +598 -0
- package/docs/plans/2026-03-15-docs-enforcement-plan.md +238 -0
- package/docs/readmes/INDEX.md +99 -0
- package/docs/readmes/features/expertise/README.md +171 -0
- package/docs/readmes/features/exports/README.md +222 -0
- package/docs/readmes/features/hooks/README.md +103 -0
- package/docs/readmes/features/hooks/loop-cap-guard.md +133 -0
- package/docs/readmes/features/hooks/post-tool-capture.md +121 -0
- package/docs/readmes/features/hooks/post-tool-lint.md +130 -0
- package/docs/readmes/features/hooks/pre-compact-summary.md +122 -0
- package/docs/readmes/features/hooks/pre-tool-capture-route.md +100 -0
- package/docs/readmes/features/hooks/protected-path-write-guard.md +128 -0
- package/docs/readmes/features/hooks/session-start.md +119 -0
- package/docs/readmes/features/hooks/stop-handoff-harvest.md +125 -0
- package/docs/readmes/features/roles/README.md +157 -0
- package/docs/readmes/features/roles/clarifier.md +152 -0
- package/docs/readmes/features/roles/content-author.md +190 -0
- package/docs/readmes/features/roles/designer.md +193 -0
- package/docs/readmes/features/roles/executor.md +184 -0
- package/docs/readmes/features/roles/learner.md +210 -0
- package/docs/readmes/features/roles/planner.md +182 -0
- package/docs/readmes/features/roles/researcher.md +164 -0
- package/docs/readmes/features/roles/reviewer.md +184 -0
- package/docs/readmes/features/roles/specifier.md +162 -0
- package/docs/readmes/features/roles/verifier.md +215 -0
- package/docs/readmes/features/schemas/README.md +178 -0
- package/docs/readmes/features/skills/README.md +63 -0
- package/docs/readmes/features/skills/brainstorming.md +96 -0
- package/docs/readmes/features/skills/debugging.md +148 -0
- package/docs/readmes/features/skills/design.md +120 -0
- package/docs/readmes/features/skills/prepare-next.md +109 -0
- package/docs/readmes/features/skills/run-audit.md +159 -0
- package/docs/readmes/features/skills/scan-project.md +109 -0
- package/docs/readmes/features/skills/self-audit.md +176 -0
- package/docs/readmes/features/skills/tdd.md +137 -0
- package/docs/readmes/features/skills/using-skills.md +92 -0
- package/docs/readmes/features/skills/verification.md +120 -0
- package/docs/readmes/features/skills/writing-plans.md +104 -0
- package/docs/readmes/features/tooling/README.md +320 -0
- package/docs/readmes/features/workflows/README.md +186 -0
- package/docs/readmes/features/workflows/author.md +181 -0
- package/docs/readmes/features/workflows/clarify.md +154 -0
- package/docs/readmes/features/workflows/design-review.md +171 -0
- package/docs/readmes/features/workflows/design.md +169 -0
- package/docs/readmes/features/workflows/discover.md +162 -0
- package/docs/readmes/features/workflows/execute.md +173 -0
- package/docs/readmes/features/workflows/learn.md +167 -0
- package/docs/readmes/features/workflows/plan-review.md +165 -0
- package/docs/readmes/features/workflows/plan.md +170 -0
- package/docs/readmes/features/workflows/prepare-next.md +167 -0
- package/docs/readmes/features/workflows/review.md +169 -0
- package/docs/readmes/features/workflows/run-audit.md +191 -0
- package/docs/readmes/features/workflows/spec-challenge.md +159 -0
- package/docs/readmes/features/workflows/specify.md +160 -0
- package/docs/readmes/features/workflows/verify.md +177 -0
- package/docs/readmes/packages/README.md +50 -0
- package/docs/readmes/packages/ajv.md +117 -0
- package/docs/readmes/packages/context-mode.md +118 -0
- package/docs/readmes/packages/gray-matter.md +116 -0
- package/docs/readmes/packages/node-test.md +137 -0
- package/docs/readmes/packages/yaml.md +112 -0
- package/docs/reference/configuration-reference.md +159 -0
- package/docs/reference/expertise-index.md +52 -0
- package/docs/reference/git-flow.md +43 -0
- package/docs/reference/hooks.md +87 -0
- package/docs/reference/host-exports.md +50 -0
- package/docs/reference/launch-checklist.md +172 -0
- package/docs/reference/marketplace-listings.md +76 -0
- package/docs/reference/release-process.md +34 -0
- package/docs/reference/roles-reference.md +77 -0
- package/docs/reference/skills.md +33 -0
- package/docs/reference/templates.md +29 -0
- package/docs/reference/tooling-cli.md +94 -0
- package/docs/truth-claims.yaml +222 -0
- package/expertise/PROGRESS.md +63 -0
- package/expertise/README.md +18 -0
- package/expertise/antipatterns/PROGRESS.md +56 -0
- package/expertise/antipatterns/backend/api-design-antipatterns.md +1271 -0
- package/expertise/antipatterns/backend/auth-antipatterns.md +1195 -0
- package/expertise/antipatterns/backend/caching-antipatterns.md +622 -0
- package/expertise/antipatterns/backend/database-antipatterns.md +1038 -0
- package/expertise/antipatterns/backend/index.md +24 -0
- package/expertise/antipatterns/backend/microservices-antipatterns.md +850 -0
- package/expertise/antipatterns/code/architecture-antipatterns.md +919 -0
- package/expertise/antipatterns/code/async-antipatterns.md +622 -0
- package/expertise/antipatterns/code/code-smells.md +1186 -0
- package/expertise/antipatterns/code/dependency-antipatterns.md +1209 -0
- package/expertise/antipatterns/code/error-handling-antipatterns.md +1360 -0
- package/expertise/antipatterns/code/index.md +27 -0
- package/expertise/antipatterns/code/naming-and-abstraction.md +1118 -0
- package/expertise/antipatterns/code/state-management-antipatterns.md +1076 -0
- package/expertise/antipatterns/code/testing-antipatterns.md +1053 -0
- package/expertise/antipatterns/design/accessibility-antipatterns.md +1136 -0
- package/expertise/antipatterns/design/dark-patterns.md +1121 -0
- package/expertise/antipatterns/design/index.md +22 -0
- package/expertise/antipatterns/design/ui-antipatterns.md +1202 -0
- package/expertise/antipatterns/design/ux-antipatterns.md +680 -0
- package/expertise/antipatterns/frontend/css-layout-antipatterns.md +691 -0
- package/expertise/antipatterns/frontend/flutter-antipatterns.md +1827 -0
- package/expertise/antipatterns/frontend/index.md +23 -0
- package/expertise/antipatterns/frontend/mobile-antipatterns.md +573 -0
- package/expertise/antipatterns/frontend/react-antipatterns.md +1128 -0
- package/expertise/antipatterns/frontend/spa-antipatterns.md +1235 -0
- package/expertise/antipatterns/index.md +31 -0
- package/expertise/antipatterns/performance/index.md +20 -0
- package/expertise/antipatterns/performance/performance-antipatterns.md +1013 -0
- package/expertise/antipatterns/performance/premature-optimization.md +623 -0
- package/expertise/antipatterns/performance/scaling-antipatterns.md +785 -0
- package/expertise/antipatterns/process/ai-coding-antipatterns.md +853 -0
- package/expertise/antipatterns/process/code-review-antipatterns.md +656 -0
- package/expertise/antipatterns/process/deployment-antipatterns.md +920 -0
- package/expertise/antipatterns/process/index.md +23 -0
- package/expertise/antipatterns/process/technical-debt-antipatterns.md +647 -0
- package/expertise/antipatterns/security/index.md +20 -0
- package/expertise/antipatterns/security/secrets-antipatterns.md +849 -0
- package/expertise/antipatterns/security/security-theater.md +843 -0
- package/expertise/antipatterns/security/vulnerability-patterns.md +801 -0
- package/expertise/architecture/PROGRESS.md +70 -0
- package/expertise/architecture/data/caching-architecture.md +671 -0
- package/expertise/architecture/data/data-consistency.md +574 -0
- package/expertise/architecture/data/data-modeling.md +536 -0
- package/expertise/architecture/data/event-streams-and-queues.md +634 -0
- package/expertise/architecture/data/index.md +25 -0
- package/expertise/architecture/data/search-architecture.md +663 -0
- package/expertise/architecture/data/sql-vs-nosql.md +708 -0
- package/expertise/architecture/decisions/architecture-decision-records.md +640 -0
- package/expertise/architecture/decisions/build-vs-buy.md +616 -0
- package/expertise/architecture/decisions/index.md +23 -0
- package/expertise/architecture/decisions/monolith-to-microservices.md +790 -0
- package/expertise/architecture/decisions/technology-selection.md +616 -0
- package/expertise/architecture/distributed/cap-theorem-and-tradeoffs.md +800 -0
- package/expertise/architecture/distributed/circuit-breaker-bulkhead.md +741 -0
- package/expertise/architecture/distributed/consensus-and-coordination.md +796 -0
- package/expertise/architecture/distributed/distributed-systems-fundamentals.md +564 -0
- package/expertise/architecture/distributed/idempotency-and-retry.md +796 -0
- package/expertise/architecture/distributed/index.md +25 -0
- package/expertise/architecture/distributed/saga-pattern.md +797 -0
- package/expertise/architecture/foundations/architectural-thinking.md +460 -0
- package/expertise/architecture/foundations/coupling-and-cohesion.md +770 -0
- package/expertise/architecture/foundations/design-principles-solid.md +649 -0
- package/expertise/architecture/foundations/domain-driven-design.md +719 -0
- package/expertise/architecture/foundations/index.md +25 -0
- package/expertise/architecture/foundations/separation-of-concerns.md +472 -0
- package/expertise/architecture/foundations/twelve-factor-app.md +797 -0
- package/expertise/architecture/index.md +34 -0
- package/expertise/architecture/integration/api-design-graphql.md +638 -0
- package/expertise/architecture/integration/api-design-grpc.md +804 -0
- package/expertise/architecture/integration/api-design-rest.md +892 -0
- package/expertise/architecture/integration/index.md +25 -0
- package/expertise/architecture/integration/third-party-integration.md +795 -0
- package/expertise/architecture/integration/webhooks-and-callbacks.md +1152 -0
- package/expertise/architecture/integration/websockets-realtime.md +791 -0
- package/expertise/architecture/mobile-architecture/index.md +22 -0
- package/expertise/architecture/mobile-architecture/mobile-app-architecture.md +780 -0
- package/expertise/architecture/mobile-architecture/mobile-backend-for-frontend.md +670 -0
- package/expertise/architecture/mobile-architecture/offline-first.md +719 -0
- package/expertise/architecture/mobile-architecture/push-and-sync.md +782 -0
- package/expertise/architecture/patterns/cqrs-event-sourcing.md +717 -0
- package/expertise/architecture/patterns/event-driven.md +797 -0
- package/expertise/architecture/patterns/hexagonal-clean-architecture.md +870 -0
- package/expertise/architecture/patterns/index.md +27 -0
- package/expertise/architecture/patterns/layered-architecture.md +736 -0
- package/expertise/architecture/patterns/microservices.md +753 -0
- package/expertise/architecture/patterns/modular-monolith.md +692 -0
- package/expertise/architecture/patterns/monolith.md +626 -0
- package/expertise/architecture/patterns/plugin-architecture.md +735 -0
- package/expertise/architecture/patterns/serverless.md +780 -0
- package/expertise/architecture/scaling/database-scaling.md +615 -0
- package/expertise/architecture/scaling/feature-flags-and-rollouts.md +757 -0
- package/expertise/architecture/scaling/horizontal-vs-vertical.md +606 -0
- package/expertise/architecture/scaling/index.md +24 -0
- package/expertise/architecture/scaling/multi-tenancy.md +800 -0
- package/expertise/architecture/scaling/stateless-design.md +787 -0
- package/expertise/backend/embedded-firmware.md +625 -0
- package/expertise/backend/go.md +853 -0
- package/expertise/backend/index.md +24 -0
- package/expertise/backend/java-spring.md +448 -0
- package/expertise/backend/node-typescript.md +625 -0
- package/expertise/backend/python-fastapi.md +724 -0
- package/expertise/backend/rust.md +458 -0
- package/expertise/backend/solidity.md +711 -0
- package/expertise/composition-map.yaml +443 -0
- package/expertise/content/foundations/content-modeling.md +395 -0
- package/expertise/content/foundations/editorial-standards.md +449 -0
- package/expertise/content/foundations/index.md +24 -0
- package/expertise/content/foundations/microcopy.md +455 -0
- package/expertise/content/foundations/terminology-governance.md +509 -0
- package/expertise/content/index.md +34 -0
- package/expertise/content/patterns/accessibility-copy.md +518 -0
- package/expertise/content/patterns/index.md +24 -0
- package/expertise/content/patterns/notification-content.md +433 -0
- package/expertise/content/patterns/sample-content.md +486 -0
- package/expertise/content/patterns/state-copy.md +439 -0
- package/expertise/design/PROGRESS.md +58 -0
- package/expertise/design/disciplines/dark-mode-theming.md +577 -0
- package/expertise/design/disciplines/design-systems.md +595 -0
- package/expertise/design/disciplines/index.md +25 -0
- package/expertise/design/disciplines/information-architecture.md +800 -0
- package/expertise/design/disciplines/interaction-design.md +788 -0
- package/expertise/design/disciplines/responsive-design.md +552 -0
- package/expertise/design/disciplines/usability-testing.md +516 -0
- package/expertise/design/disciplines/user-research.md +792 -0
- package/expertise/design/foundations/accessibility-design.md +796 -0
- package/expertise/design/foundations/color-theory.md +797 -0
- package/expertise/design/foundations/iconography.md +795 -0
- package/expertise/design/foundations/index.md +26 -0
- package/expertise/design/foundations/motion-and-animation.md +653 -0
- package/expertise/design/foundations/rtl-design.md +585 -0
- package/expertise/design/foundations/spacing-and-layout.md +607 -0
- package/expertise/design/foundations/typography.md +800 -0
- package/expertise/design/foundations/visual-hierarchy.md +761 -0
- package/expertise/design/index.md +32 -0
- package/expertise/design/patterns/authentication-flows.md +474 -0
- package/expertise/design/patterns/content-consumption.md +789 -0
- package/expertise/design/patterns/data-display.md +618 -0
- package/expertise/design/patterns/e-commerce.md +1494 -0
- package/expertise/design/patterns/feedback-and-states.md +642 -0
- package/expertise/design/patterns/forms-and-input.md +819 -0
- package/expertise/design/patterns/gamification.md +801 -0
- package/expertise/design/patterns/index.md +31 -0
- package/expertise/design/patterns/microinteractions.md +449 -0
- package/expertise/design/patterns/navigation.md +800 -0
- package/expertise/design/patterns/notifications.md +705 -0
- package/expertise/design/patterns/onboarding.md +700 -0
- package/expertise/design/patterns/search-and-filter.md +601 -0
- package/expertise/design/patterns/settings-and-preferences.md +768 -0
- package/expertise/design/patterns/social-and-community.md +748 -0
- package/expertise/design/platforms/desktop-native.md +612 -0
- package/expertise/design/platforms/index.md +25 -0
- package/expertise/design/platforms/mobile-android.md +825 -0
- package/expertise/design/platforms/mobile-cross-platform.md +983 -0
- package/expertise/design/platforms/mobile-ios.md +699 -0
- package/expertise/design/platforms/tablet.md +794 -0
- package/expertise/design/platforms/web-dashboard.md +790 -0
- package/expertise/design/platforms/web-responsive.md +550 -0
- package/expertise/design/psychology/behavioral-nudges.md +449 -0
- package/expertise/design/psychology/cognitive-load.md +1191 -0
- package/expertise/design/psychology/error-psychology.md +778 -0
- package/expertise/design/psychology/index.md +22 -0
- package/expertise/design/psychology/persuasive-design.md +736 -0
- package/expertise/design/psychology/user-mental-models.md +623 -0
- package/expertise/design/tooling/open-pencil.md +266 -0
- package/expertise/frontend/angular.md +1073 -0
- package/expertise/frontend/desktop-electron.md +546 -0
- package/expertise/frontend/flutter.md +782 -0
- package/expertise/frontend/index.md +27 -0
- package/expertise/frontend/native-android.md +409 -0
- package/expertise/frontend/native-ios.md +490 -0
- package/expertise/frontend/react-native.md +1160 -0
- package/expertise/frontend/react.md +808 -0
- package/expertise/frontend/vue.md +1089 -0
- package/expertise/humanize/domain-rules-code.md +79 -0
- package/expertise/humanize/domain-rules-content.md +67 -0
- package/expertise/humanize/domain-rules-technical-docs.md +56 -0
- package/expertise/humanize/index.md +35 -0
- package/expertise/humanize/self-audit-checklist.md +87 -0
- package/expertise/humanize/sentence-patterns.md +218 -0
- package/expertise/humanize/vocabulary-blacklist.md +105 -0
- package/expertise/i18n/PROGRESS.md +65 -0
- package/expertise/i18n/advanced/accessibility-and-i18n.md +28 -0
- package/expertise/i18n/advanced/bidirectional-text-algorithm.md +38 -0
- package/expertise/i18n/advanced/complex-scripts.md +30 -0
- package/expertise/i18n/advanced/performance-and-i18n.md +27 -0
- package/expertise/i18n/advanced/testing-i18n.md +28 -0
- package/expertise/i18n/content/content-adaptation.md +23 -0
- package/expertise/i18n/content/locale-specific-formatting.md +23 -0
- package/expertise/i18n/content/machine-translation-integration.md +28 -0
- package/expertise/i18n/content/translation-management.md +29 -0
- package/expertise/i18n/foundations/date-time-calendars.md +67 -0
- package/expertise/i18n/foundations/i18n-architecture.md +272 -0
- package/expertise/i18n/foundations/locale-and-language-tags.md +79 -0
- package/expertise/i18n/foundations/numbers-currency-units.md +61 -0
- package/expertise/i18n/foundations/pluralization-and-gender.md +109 -0
- package/expertise/i18n/foundations/string-externalization.md +236 -0
- package/expertise/i18n/foundations/text-direction-bidi.md +241 -0
- package/expertise/i18n/foundations/unicode-and-encoding.md +86 -0
- package/expertise/i18n/index.md +38 -0
- package/expertise/i18n/platform/backend-i18n.md +31 -0
- package/expertise/i18n/platform/flutter-i18n.md +148 -0
- package/expertise/i18n/platform/native-android-i18n.md +36 -0
- package/expertise/i18n/platform/native-ios-i18n.md +36 -0
- package/expertise/i18n/platform/react-i18n.md +103 -0
- package/expertise/i18n/platform/web-css-i18n.md +81 -0
- package/expertise/i18n/rtl/arabic-specific.md +175 -0
- package/expertise/i18n/rtl/hebrew-specific.md +149 -0
- package/expertise/i18n/rtl/rtl-animations-and-transitions.md +111 -0
- package/expertise/i18n/rtl/rtl-forms-and-input.md +161 -0
- package/expertise/i18n/rtl/rtl-fundamentals.md +211 -0
- package/expertise/i18n/rtl/rtl-icons-and-images.md +181 -0
- package/expertise/i18n/rtl/rtl-layout-mirroring.md +252 -0
- package/expertise/i18n/rtl/rtl-navigation-and-gestures.md +107 -0
- package/expertise/i18n/rtl/rtl-testing-and-qa.md +147 -0
- package/expertise/i18n/rtl/rtl-typography.md +160 -0
- package/expertise/index.md +113 -0
- package/expertise/index.yaml +216 -0
- package/expertise/infrastructure/cloud-aws.md +597 -0
- package/expertise/infrastructure/cloud-gcp.md +599 -0
- package/expertise/infrastructure/cybersecurity.md +816 -0
- package/expertise/infrastructure/database-mongodb.md +447 -0
- package/expertise/infrastructure/database-postgres.md +400 -0
- package/expertise/infrastructure/devops-cicd.md +787 -0
- package/expertise/infrastructure/index.md +27 -0
- package/expertise/performance/PROGRESS.md +50 -0
- package/expertise/performance/backend/api-latency.md +1204 -0
- package/expertise/performance/backend/background-jobs.md +506 -0
- package/expertise/performance/backend/connection-pooling.md +1209 -0
- package/expertise/performance/backend/database-query-optimization.md +515 -0
- package/expertise/performance/backend/index.md +23 -0
- package/expertise/performance/backend/rate-limiting-and-throttling.md +971 -0
- package/expertise/performance/foundations/algorithmic-complexity.md +954 -0
- package/expertise/performance/foundations/caching-strategies.md +489 -0
- package/expertise/performance/foundations/concurrency-and-parallelism.md +847 -0
- package/expertise/performance/foundations/index.md +24 -0
- package/expertise/performance/foundations/measuring-and-profiling.md +440 -0
- package/expertise/performance/foundations/memory-management.md +964 -0
- package/expertise/performance/foundations/performance-budgets.md +1314 -0
- package/expertise/performance/index.md +31 -0
- package/expertise/performance/infrastructure/auto-scaling.md +1059 -0
- package/expertise/performance/infrastructure/cdn-and-edge.md +1081 -0
- package/expertise/performance/infrastructure/index.md +22 -0
- package/expertise/performance/infrastructure/load-balancing.md +1081 -0
- package/expertise/performance/infrastructure/observability.md +1079 -0
- package/expertise/performance/mobile/index.md +23 -0
- package/expertise/performance/mobile/mobile-animations.md +544 -0
- package/expertise/performance/mobile/mobile-memory-battery.md +416 -0
- package/expertise/performance/mobile/mobile-network.md +452 -0
- package/expertise/performance/mobile/mobile-rendering.md +599 -0
- package/expertise/performance/mobile/mobile-startup-time.md +505 -0
- package/expertise/performance/platform-specific/flutter-performance.md +647 -0
- package/expertise/performance/platform-specific/index.md +22 -0
- package/expertise/performance/platform-specific/node-performance.md +1307 -0
- package/expertise/performance/platform-specific/postgres-performance.md +1366 -0
- package/expertise/performance/platform-specific/react-performance.md +1403 -0
- package/expertise/performance/web/bundle-optimization.md +1239 -0
- package/expertise/performance/web/image-and-media.md +636 -0
- package/expertise/performance/web/index.md +24 -0
- package/expertise/performance/web/network-optimization.md +1133 -0
- package/expertise/performance/web/rendering-performance.md +1098 -0
- package/expertise/performance/web/ssr-and-hydration.md +918 -0
- package/expertise/performance/web/web-vitals.md +1374 -0
- package/expertise/quality/accessibility.md +985 -0
- package/expertise/quality/evidence-based-verification.md +499 -0
- package/expertise/quality/index.md +24 -0
- package/expertise/quality/ml-model-audit.md +614 -0
- package/expertise/quality/performance.md +600 -0
- package/expertise/quality/testing-api.md +891 -0
- package/expertise/quality/testing-mobile.md +496 -0
- package/expertise/quality/testing-web.md +849 -0
- package/expertise/security/PROGRESS.md +54 -0
- package/expertise/security/agentic-identity.md +540 -0
- package/expertise/security/compliance-frameworks.md +601 -0
- package/expertise/security/data/data-encryption.md +364 -0
- package/expertise/security/data/data-privacy-gdpr.md +692 -0
- package/expertise/security/data/database-security.md +1171 -0
- package/expertise/security/data/index.md +22 -0
- package/expertise/security/data/pii-handling.md +531 -0
- package/expertise/security/foundations/authentication.md +1041 -0
- package/expertise/security/foundations/authorization.md +603 -0
- package/expertise/security/foundations/cryptography.md +1001 -0
- package/expertise/security/foundations/index.md +25 -0
- package/expertise/security/foundations/owasp-top-10.md +1354 -0
- package/expertise/security/foundations/secrets-management.md +1217 -0
- package/expertise/security/foundations/secure-sdlc.md +700 -0
- package/expertise/security/foundations/supply-chain-security.md +698 -0
- package/expertise/security/index.md +31 -0
- package/expertise/security/infrastructure/cloud-security-aws.md +1296 -0
- package/expertise/security/infrastructure/cloud-security-gcp.md +1376 -0
- package/expertise/security/infrastructure/container-security.md +721 -0
- package/expertise/security/infrastructure/incident-response.md +1295 -0
- package/expertise/security/infrastructure/index.md +24 -0
- package/expertise/security/infrastructure/logging-and-monitoring.md +1618 -0
- package/expertise/security/infrastructure/network-security.md +1337 -0
- package/expertise/security/mobile/index.md +23 -0
- package/expertise/security/mobile/mobile-android-security.md +1218 -0
- package/expertise/security/mobile/mobile-binary-protection.md +1229 -0
- package/expertise/security/mobile/mobile-data-storage.md +1265 -0
- package/expertise/security/mobile/mobile-ios-security.md +1401 -0
- package/expertise/security/mobile/mobile-network-security.md +1520 -0
- package/expertise/security/smart-contract-security.md +594 -0
- package/expertise/security/testing/index.md +22 -0
- package/expertise/security/testing/penetration-testing.md +1258 -0
- package/expertise/security/testing/security-code-review.md +1765 -0
- package/expertise/security/testing/threat-modeling.md +1074 -0
- package/expertise/security/testing/vulnerability-scanning.md +1062 -0
- package/expertise/security/web/api-security.md +586 -0
- package/expertise/security/web/cors-and-headers.md +433 -0
- package/expertise/security/web/csrf.md +562 -0
- package/expertise/security/web/file-upload.md +1477 -0
- package/expertise/security/web/index.md +25 -0
- package/expertise/security/web/injection.md +1375 -0
- package/expertise/security/web/session-management.md +1101 -0
- package/expertise/security/web/xss.md +1158 -0
- package/exports/README.md +17 -0
- package/exports/hosts/claude/.claude/agents/clarifier.md +42 -0
- package/exports/hosts/claude/.claude/agents/content-author.md +63 -0
- package/exports/hosts/claude/.claude/agents/designer.md +55 -0
- package/exports/hosts/claude/.claude/agents/executor.md +55 -0
- package/exports/hosts/claude/.claude/agents/learner.md +51 -0
- package/exports/hosts/claude/.claude/agents/planner.md +53 -0
- package/exports/hosts/claude/.claude/agents/researcher.md +43 -0
- package/exports/hosts/claude/.claude/agents/reviewer.md +54 -0
- package/exports/hosts/claude/.claude/agents/specifier.md +47 -0
- package/exports/hosts/claude/.claude/agents/verifier.md +71 -0
- package/exports/hosts/claude/.claude/commands/author.md +42 -0
- package/exports/hosts/claude/.claude/commands/clarify.md +38 -0
- package/exports/hosts/claude/.claude/commands/design-review.md +46 -0
- package/exports/hosts/claude/.claude/commands/design.md +44 -0
- package/exports/hosts/claude/.claude/commands/discover.md +37 -0
- package/exports/hosts/claude/.claude/commands/execute.md +48 -0
- package/exports/hosts/claude/.claude/commands/learn.md +38 -0
- package/exports/hosts/claude/.claude/commands/plan-review.md +42 -0
- package/exports/hosts/claude/.claude/commands/plan.md +39 -0
- package/exports/hosts/claude/.claude/commands/prepare-next.md +37 -0
- package/exports/hosts/claude/.claude/commands/review.md +40 -0
- package/exports/hosts/claude/.claude/commands/run-audit.md +41 -0
- package/exports/hosts/claude/.claude/commands/spec-challenge.md +41 -0
- package/exports/hosts/claude/.claude/commands/specify.md +38 -0
- package/exports/hosts/claude/.claude/commands/verify.md +37 -0
- package/exports/hosts/claude/.claude/settings.json +34 -0
- package/exports/hosts/claude/CLAUDE.md +19 -0
- package/exports/hosts/claude/export.manifest.json +38 -0
- package/exports/hosts/claude/host-package.json +67 -0
- package/exports/hosts/codex/AGENTS.md +19 -0
- package/exports/hosts/codex/export.manifest.json +38 -0
- package/exports/hosts/codex/host-package.json +41 -0
- package/exports/hosts/cursor/.cursor/hooks.json +16 -0
- package/exports/hosts/cursor/.cursor/rules/wazir-core.mdc +19 -0
- package/exports/hosts/cursor/export.manifest.json +38 -0
- package/exports/hosts/cursor/host-package.json +42 -0
- package/exports/hosts/gemini/GEMINI.md +19 -0
- package/exports/hosts/gemini/export.manifest.json +38 -0
- package/exports/hosts/gemini/host-package.json +41 -0
- package/hooks/README.md +18 -0
- package/hooks/definitions/loop_cap_guard.yaml +21 -0
- package/hooks/definitions/post_tool_capture.yaml +24 -0
- package/hooks/definitions/pre_compact_summary.yaml +19 -0
- package/hooks/definitions/pre_tool_capture_route.yaml +19 -0
- package/hooks/definitions/protected_path_write_guard.yaml +19 -0
- package/hooks/definitions/session_start.yaml +19 -0
- package/hooks/definitions/stop_handoff_harvest.yaml +20 -0
- package/hooks/loop-cap-guard +17 -0
- package/hooks/post-tool-lint +36 -0
- package/hooks/protected-path-write-guard +17 -0
- package/hooks/session-start +41 -0
- package/llms-full.txt +2355 -0
- package/llms.txt +43 -0
- package/package.json +79 -0
- package/roles/README.md +20 -0
- package/roles/clarifier.md +42 -0
- package/roles/content-author.md +63 -0
- package/roles/designer.md +55 -0
- package/roles/executor.md +55 -0
- package/roles/learner.md +51 -0
- package/roles/planner.md +53 -0
- package/roles/researcher.md +43 -0
- package/roles/reviewer.md +54 -0
- package/roles/specifier.md +47 -0
- package/roles/verifier.md +71 -0
- package/schemas/README.md +24 -0
- package/schemas/accepted-learning.schema.json +20 -0
- package/schemas/author-artifact.schema.json +156 -0
- package/schemas/clarification.schema.json +19 -0
- package/schemas/design-artifact.schema.json +80 -0
- package/schemas/docs-claim.schema.json +18 -0
- package/schemas/export-manifest.schema.json +20 -0
- package/schemas/hook.schema.json +67 -0
- package/schemas/host-export-package.schema.json +18 -0
- package/schemas/implementation-plan.schema.json +19 -0
- package/schemas/proposed-learning.schema.json +19 -0
- package/schemas/research.schema.json +18 -0
- package/schemas/review.schema.json +29 -0
- package/schemas/run-manifest.schema.json +18 -0
- package/schemas/spec-challenge.schema.json +18 -0
- package/schemas/spec.schema.json +20 -0
- package/schemas/usage.schema.json +102 -0
- package/schemas/verification-proof.schema.json +29 -0
- package/schemas/wazir-manifest.schema.json +173 -0
- package/skills/README.md +40 -0
- package/skills/brainstorming/SKILL.md +77 -0
- package/skills/debugging/SKILL.md +50 -0
- package/skills/design/SKILL.md +61 -0
- package/skills/dispatching-parallel-agents/SKILL.md +128 -0
- package/skills/executing-plans/SKILL.md +70 -0
- package/skills/finishing-a-development-branch/SKILL.md +169 -0
- package/skills/humanize/SKILL.md +123 -0
- package/skills/init-pipeline/SKILL.md +124 -0
- package/skills/prepare-next/SKILL.md +20 -0
- package/skills/receiving-code-review/SKILL.md +123 -0
- package/skills/requesting-code-review/SKILL.md +105 -0
- package/skills/requesting-code-review/code-reviewer.md +108 -0
- package/skills/run-audit/SKILL.md +197 -0
- package/skills/scan-project/SKILL.md +41 -0
- package/skills/self-audit/SKILL.md +153 -0
- package/skills/subagent-driven-development/SKILL.md +154 -0
- package/skills/subagent-driven-development/code-quality-reviewer-prompt.md +26 -0
- package/skills/subagent-driven-development/implementer-prompt.md +102 -0
- package/skills/subagent-driven-development/spec-reviewer-prompt.md +61 -0
- package/skills/tdd/SKILL.md +23 -0
- package/skills/using-git-worktrees/SKILL.md +163 -0
- package/skills/using-skills/SKILL.md +95 -0
- package/skills/verification/SKILL.md +22 -0
- package/skills/wazir/SKILL.md +463 -0
- package/skills/writing-plans/SKILL.md +30 -0
- package/skills/writing-skills/SKILL.md +157 -0
- package/skills/writing-skills/anthropic-best-practices.md +122 -0
- package/skills/writing-skills/persuasion-principles.md +50 -0
- package/templates/README.md +20 -0
- package/templates/artifacts/README.md +10 -0
- package/templates/artifacts/accepted-learning.md +19 -0
- package/templates/artifacts/accepted-learning.template.json +12 -0
- package/templates/artifacts/author.md +74 -0
- package/templates/artifacts/author.template.json +19 -0
- package/templates/artifacts/clarification.md +21 -0
- package/templates/artifacts/clarification.template.json +12 -0
- package/templates/artifacts/execute-notes.md +19 -0
- package/templates/artifacts/implementation-plan.md +21 -0
- package/templates/artifacts/implementation-plan.template.json +11 -0
- package/templates/artifacts/learning-proposal.md +19 -0
- package/templates/artifacts/next-run-handoff.md +21 -0
- package/templates/artifacts/plan-review.md +19 -0
- package/templates/artifacts/proposed-learning.template.json +12 -0
- package/templates/artifacts/research.md +21 -0
- package/templates/artifacts/research.template.json +12 -0
- package/templates/artifacts/review-findings.md +19 -0
- package/templates/artifacts/review.template.json +11 -0
- package/templates/artifacts/run-manifest.template.json +8 -0
- package/templates/artifacts/spec-challenge.md +19 -0
- package/templates/artifacts/spec-challenge.template.json +11 -0
- package/templates/artifacts/spec.md +21 -0
- package/templates/artifacts/spec.template.json +12 -0
- package/templates/artifacts/verification-proof.md +19 -0
- package/templates/artifacts/verification-proof.template.json +11 -0
- package/templates/examples/accepted-learning.example.json +14 -0
- package/templates/examples/author.example.json +152 -0
- package/templates/examples/clarification.example.json +15 -0
- package/templates/examples/docs-claim.example.json +8 -0
- package/templates/examples/export-manifest.example.json +7 -0
- package/templates/examples/host-export-package.example.json +11 -0
- package/templates/examples/implementation-plan.example.json +17 -0
- package/templates/examples/proposed-learning.example.json +13 -0
- package/templates/examples/research.example.json +15 -0
- package/templates/examples/research.example.md +6 -0
- package/templates/examples/review.example.json +17 -0
- package/templates/examples/run-manifest.example.json +9 -0
- package/templates/examples/spec-challenge.example.json +14 -0
- package/templates/examples/spec.example.json +21 -0
- package/templates/examples/verification-proof.example.json +21 -0
- package/templates/examples/wazir-manifest.example.yaml +65 -0
- package/templates/task-definition-schema.md +99 -0
- package/tooling/README.md +20 -0
- package/tooling/src/adapters/context-mode.js +50 -0
- package/tooling/src/capture/command.js +376 -0
- package/tooling/src/capture/store.js +99 -0
- package/tooling/src/capture/usage.js +270 -0
- package/tooling/src/checks/branches.js +50 -0
- package/tooling/src/checks/brand-truth.js +110 -0
- package/tooling/src/checks/changelog.js +231 -0
- package/tooling/src/checks/command-registry.js +36 -0
- package/tooling/src/checks/commits.js +102 -0
- package/tooling/src/checks/docs-drift.js +103 -0
- package/tooling/src/checks/docs-truth.js +201 -0
- package/tooling/src/checks/runtime-surface.js +156 -0
- package/tooling/src/cli.js +116 -0
- package/tooling/src/command-options.js +56 -0
- package/tooling/src/commands/validate.js +320 -0
- package/tooling/src/doctor/command.js +91 -0
- package/tooling/src/export/command.js +77 -0
- package/tooling/src/export/compiler.js +498 -0
- package/tooling/src/guards/loop-cap-guard.js +52 -0
- package/tooling/src/guards/protected-path-write-guard.js +67 -0
- package/tooling/src/index/command.js +152 -0
- package/tooling/src/index/storage.js +1061 -0
- package/tooling/src/index/summarizers.js +261 -0
- package/tooling/src/loaders.js +18 -0
- package/tooling/src/project-root.js +22 -0
- package/tooling/src/recall/command.js +225 -0
- package/tooling/src/schema-validator.js +30 -0
- package/tooling/src/state-root.js +40 -0
- package/tooling/src/status/command.js +71 -0
- package/wazir.manifest.yaml +135 -0
- package/workflows/README.md +19 -0
- package/workflows/author.md +42 -0
- package/workflows/clarify.md +38 -0
- package/workflows/design-review.md +46 -0
- package/workflows/design.md +44 -0
- package/workflows/discover.md +37 -0
- package/workflows/execute.md +48 -0
- package/workflows/learn.md +38 -0
- package/workflows/plan-review.md +42 -0
- package/workflows/plan.md +39 -0
- package/workflows/prepare-next.md +37 -0
- package/workflows/review.md +40 -0
- package/workflows/run-audit.md +41 -0
- package/workflows/spec-challenge.md +41 -0
- package/workflows/specify.md +38 -0
- package/workflows/verify.md +37 -0
|
@@ -0,0 +1,536 @@
|
|
|
1
|
+
# Data Modeling -- Architecture Expertise Module
|
|
2
|
+
|
|
3
|
+
> Data modeling defines how data is structured, stored, and related. Wrong data models are
|
|
4
|
+
> extremely expensive to fix -- requiring migrations, code changes, and often downtime.
|
|
5
|
+
> Getting the model right before writing application code is one of the highest-ROI
|
|
6
|
+
> architectural activities.
|
|
7
|
+
|
|
8
|
+
> **Category:** Data
|
|
9
|
+
> **Complexity:** Moderate
|
|
10
|
+
> **Applies when:** Any system that persists state -- which is every system
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## What This Is (and What It Isn't)
|
|
15
|
+
|
|
16
|
+
**Data modeling** is the disciplined process of discovering, analyzing, and defining the data
|
|
17
|
+
requirements of a system, then representing those requirements as a formal structure. It is
|
|
18
|
+
not "drawing tables in a diagramming tool." It is identifying the entities your system cares
|
|
19
|
+
about, the relationships between them, the constraints that must hold, and the access
|
|
20
|
+
patterns that determine how data should be physically organized.
|
|
21
|
+
|
|
22
|
+
A data model exists at three levels of abstraction:
|
|
23
|
+
|
|
24
|
+
| Level | Purpose | Audience | Artifact |
|
|
25
|
+
|-------|---------|----------|----------|
|
|
26
|
+
| **Conceptual** | Capture business entities and high-level relationships | Business stakeholders, product owners | ER diagram with business names |
|
|
27
|
+
| **Logical** | Define attributes, data types, cardinality, constraints, normalization | Architects, senior engineers | Fully attributed ER diagram with keys |
|
|
28
|
+
| **Physical** | Map the logical model to a specific database engine | DBAs, backend engineers | DDL scripts, migration files |
|
|
29
|
+
|
|
30
|
+
**Entity-Relationship (ER) modeling** is the primary technique at the conceptual and logical
|
|
31
|
+
levels. An ER model defines **entities** (things the system tracks), **attributes** (their
|
|
32
|
+
properties), **relationships** (how entities relate), **cardinality** (one-to-many,
|
|
33
|
+
many-to-many), and **constraints** (rules that must hold).
|
|
34
|
+
|
|
35
|
+
### What It Is NOT
|
|
36
|
+
|
|
37
|
+
- **Not a one-time activity.** Data models evolve as requirements change. The initial model
|
|
38
|
+
is a hypothesis refined through production experience.
|
|
39
|
+
- **Not just for relational databases.** Document stores, graph databases, and event stores
|
|
40
|
+
all require data modeling -- the techniques differ but the discipline is the same.
|
|
41
|
+
- **Not optional for "agile" teams.** Spend 2-4 hours modeling before writing schema code.
|
|
42
|
+
That prevents weeks of migration pain later.
|
|
43
|
+
- **Not the same as ORM class definitions.** ORM classes are a physical model artifact.
|
|
44
|
+
Designing by writing Django models or Hibernate entities skips the conceptual and logical
|
|
45
|
+
levels, leading to schemas shaped by framework conventions rather than business requirements.
|
|
46
|
+
|
|
47
|
+
---
|
|
48
|
+
|
|
49
|
+
## When to Use It
|
|
50
|
+
|
|
51
|
+
### 1. Greenfield Systems
|
|
52
|
+
Before writing any schema code, invest in a logical data model. The cost of changing a model
|
|
53
|
+
increases exponentially after production launch.
|
|
54
|
+
|
|
55
|
+
**Evidence -- Shopify:** Their architecture team documented that the most expensive technical
|
|
56
|
+
debt traces back to early data model decisions in their Rails monolith. Tables designed for
|
|
57
|
+
a simple store in 2006 required years of migration to support multi-channel commerce.
|
|
58
|
+
|
|
59
|
+
### 2. Domain Complexity
|
|
60
|
+
When the domain has 15+ entities with non-trivial relationships (hierarchies, polymorphism,
|
|
61
|
+
temporal validity), formal modeling prevents inconsistencies that surface months later as bugs.
|
|
62
|
+
|
|
63
|
+
**Evidence -- Healthcare systems:** The "Bad CaRMa" case study documented a CRM system that
|
|
64
|
+
skipped formal modeling and used generic EAV tables, generating an estimated ROI of minus
|
|
65
|
+
$10 million during rebuild.
|
|
66
|
+
|
|
67
|
+
### 3. Multiple Teams Writing to the Same Database
|
|
68
|
+
A shared logical model prevents teams from creating conflicting schemas, duplicate entities
|
|
69
|
+
under different names, or incompatible representations of the same concept.
|
|
70
|
+
|
|
71
|
+
### 4. Regulatory Requirements
|
|
72
|
+
GDPR, HIPAA, SOX, and PCI-DSS impose constraints on how data is structured, retained, and
|
|
73
|
+
deleted. A formal model makes compliance auditable.
|
|
74
|
+
|
|
75
|
+
---
|
|
76
|
+
|
|
77
|
+
## When NOT to Use It
|
|
78
|
+
|
|
79
|
+
### 1. Throwaway Prototypes
|
|
80
|
+
Code deleted within 2 weeks can use a quick schema. But label it disposable -- the danger is
|
|
81
|
+
prototypes that survive into production.
|
|
82
|
+
|
|
83
|
+
### 2. Over-Normalization
|
|
84
|
+
Normalizing to BCNF or 5NF when 3NF is sufficient creates unnecessary join complexity.
|
|
85
|
+
**Anti-pattern:** A team normalized addresses into five tables (street, city, state, country,
|
|
86
|
+
postal_code). Every query required five joins. A single `addresses` table was the right model.
|
|
87
|
+
|
|
88
|
+
### 3. Schema-on-Read Workloads
|
|
89
|
+
For data lake ingestion, log aggregation, or ML feature stores where data shape is unknown
|
|
90
|
+
at write time, use schema-on-read (Parquet, JSON in document stores) and model at the
|
|
91
|
+
consumption layer.
|
|
92
|
+
|
|
93
|
+
### 4. Event-Sourced Systems (Partially)
|
|
94
|
+
Events are append-only and the event log is the source of truth. You still model events and
|
|
95
|
+
projections, but the techniques differ significantly from relational modeling.
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
|
|
99
|
+
## How It Works
|
|
100
|
+
|
|
101
|
+
### Normalization: The Foundation
|
|
102
|
+
|
|
103
|
+
Normalization organizes data to reduce redundancy and prevent update anomalies:
|
|
104
|
+
|
|
105
|
+
**1NF:** Every column contains atomic values. No repeating groups. Each row is uniquely
|
|
106
|
+
identifiable.
|
|
107
|
+
|
|
108
|
+
**2NF:** Satisfies 1NF. Every non-key attribute depends on the *entire* primary key (no
|
|
109
|
+
partial dependencies). Only relevant for composite keys.
|
|
110
|
+
|
|
111
|
+
**3NF:** Satisfies 2NF. No transitive dependencies: non-key attributes depend only on the
|
|
112
|
+
primary key, not on other non-key attributes.
|
|
113
|
+
|
|
114
|
+
**BCNF:** Satisfies 3NF. Every determinant is a candidate key. Rarely needed in practice --
|
|
115
|
+
3NF handles 95%+ of real-world schemas.
|
|
116
|
+
|
|
117
|
+
**Rule of thumb:** Normalize to 3NF for OLTP. Denormalize deliberately for read-heavy
|
|
118
|
+
workloads. Document every denormalization decision and how consistency is maintained.
|
|
119
|
+
|
|
120
|
+
### Natural Keys vs. Surrogate Keys
|
|
121
|
+
|
|
122
|
+
| Aspect | Natural Key | Surrogate Key |
|
|
123
|
+
|--------|-------------|---------------|
|
|
124
|
+
| **Definition** | From business data (email, ISBN) | System-generated (auto-increment, UUID) |
|
|
125
|
+
| **Stability** | Can change (user changes email) | Never changes |
|
|
126
|
+
| **Size** | Variable, often larger (varchar) | Fixed, compact (bigint) or 16 bytes (UUID) |
|
|
127
|
+
| **Business meaning** | Self-documenting | Requires joins to understand what a row represents |
|
|
128
|
+
| **Cross-system** | Natural joins without mapping | Requires mapping tables between systems |
|
|
129
|
+
|
|
130
|
+
**Recommendation:** Use surrogate keys (bigint or UUIDv7) as primary keys. Enforce natural
|
|
131
|
+
keys as unique constraints. This gives you stability with query clarity.
|
|
132
|
+
|
|
133
|
+
### UUID vs. Integer at Scale
|
|
134
|
+
|
|
135
|
+
| Key Type | Storage | Insert Pattern | Throughput | Best For |
|
|
136
|
+
|----------|---------|----------------|------------|----------|
|
|
137
|
+
| **bigint auto-increment** | 8 bytes | Sequential (end of B-tree) | Highest | Single-database OLTP |
|
|
138
|
+
| **UUIDv4 (random)** | 16 bytes | Random (page splits, cache misses) | Lowest | Legacy compatibility only |
|
|
139
|
+
| **UUIDv7 (time-ordered)** | 16 bytes | Sequential (time-sorted) | High | New systems, distributed (recommended default) |
|
|
140
|
+
| **Snowflake ID** | 8 bytes | Sequential (timestamp-encoded) | Highest | High-scale distributed (Twitter, Discord) |
|
|
141
|
+
|
|
142
|
+
PlanetScale documented that random UUIDs produce "orders of magnitude more WAL volume" than
|
|
143
|
+
sequential keys in MySQL. UUIDv7 is supported natively in PostgreSQL 17+.
|
|
144
|
+
|
|
145
|
+
### Indexing Strategy
|
|
146
|
+
|
|
147
|
+
1. **Primary keys are indexed automatically.** Do not create duplicates.
|
|
148
|
+
2. **Index foreign keys.** Most databases do NOT auto-create these. Missing FK indexes are
|
|
149
|
+
the number-one production performance issue.
|
|
150
|
+
3. **Index WHERE, ORDER BY, GROUP BY columns** -- but only if selectivity is high.
|
|
151
|
+
4. **Composite indexes follow the left-prefix rule.** Index on (a, b, c) supports queries
|
|
152
|
+
on (a), (a, b), or (a, b, c) -- but NOT (b, c) alone.
|
|
153
|
+
5. **Partial indexes** for soft-delete patterns: `CREATE INDEX ... WHERE deleted_at IS NULL`.
|
|
154
|
+
6. **Do not over-index.** Each index slows writes and consumes storage.
|
|
155
|
+
|
|
156
|
+
### Soft Deletes
|
|
157
|
+
|
|
158
|
+
Soft deletion marks records as deleted (`deleted_at` timestamp) rather than removing them.
|
|
159
|
+
|
|
160
|
+
**Use when:** Financial records, audit-required data, regulatory compliance, data referenced
|
|
161
|
+
by foreign keys, user-facing "archive" features.
|
|
162
|
+
|
|
163
|
+
**Avoid when:** GDPR right-to-erasure (soft-deleted data is still personal data), temporary
|
|
164
|
+
data, performance-critical tables.
|
|
165
|
+
|
|
166
|
+
**Pitfalls:** Every query must include `WHERE deleted_at IS NULL`. UNIQUE constraints must
|
|
167
|
+
become partial. Table bloat accumulates without purge policies. Use partial indexes to
|
|
168
|
+
mitigate:
|
|
169
|
+
```sql
|
|
170
|
+
CREATE INDEX idx_users_email_active ON users (email) WHERE deleted_at IS NULL;
|
|
171
|
+
CREATE UNIQUE INDEX idx_users_email_unique ON users (email) WHERE deleted_at IS NULL;
|
|
172
|
+
```
|
|
173
|
+
|
|
174
|
+
### Polymorphic Relationships
|
|
175
|
+
|
|
176
|
+
When multiple entity types participate in the same relationship:
|
|
177
|
+
|
|
178
|
+
**1. STI (Rails polymorphic):** Single `commentable_type` + `commentable_id` column. Simple
|
|
179
|
+
but cannot enforce foreign keys. Anti-pattern in strict relational modeling.
|
|
180
|
+
|
|
181
|
+
**2. Exclusive Belongs-To:** Nullable FK per type with a CHECK constraint ensuring exactly
|
|
182
|
+
one is set. Real FKs, but adding types requires ALTER TABLE.
|
|
183
|
+
|
|
184
|
+
**3. Join Tables per Type (Recommended):** Separate `post_comments`, `photo_comments` tables.
|
|
185
|
+
Full referential integrity, no NULLs, extensible without altering the base table.
|
|
186
|
+
|
|
187
|
+
### Schema Evolution: The Expand-Contract Pattern
|
|
188
|
+
|
|
189
|
+
Unsafe changes (rename/remove columns, change types) require the expand-contract pattern:
|
|
190
|
+
|
|
191
|
+
**Expand:** Add new column/table alongside old. Deploy code writing to both. Backfill data.
|
|
192
|
+
**Migrate:** Deploy code reading from the new structure. Verify correctness.
|
|
193
|
+
**Contract:** Stop writing to old. Drop old column/table.
|
|
194
|
+
|
|
195
|
+
Each phase is a separate deployment, independently safe and reversible. Tools like Xata's
|
|
196
|
+
`pgroll` automate this for PostgreSQL using virtual schemas with views.
|
|
197
|
+
|
|
198
|
+
### Event Sourcing as an Alternative
|
|
199
|
+
|
|
200
|
+
Instead of storing current state, event sourcing stores the sequence of events that produced
|
|
201
|
+
it. You still model event schemas, projection schemas, and snapshot schemas -- but the
|
|
202
|
+
techniques differ fundamentally from entity-centric modeling.
|
|
203
|
+
|
|
204
|
+
---
|
|
205
|
+
|
|
206
|
+
## Trade-Offs Matrix
|
|
207
|
+
|
|
208
|
+
| Approach | Writes | Reads | Integrity | Schema Flexibility | Best For |
|
|
209
|
+
|----------|--------|-------|-----------|--------------------|----|
|
|
210
|
+
| **Fully Normalized (3NF)** | Excellent | Poor (joins) | Excellent | Moderate | OLTP with high write volume |
|
|
211
|
+
| **Partially Denormalized** | Good | Good | Good | Moderate | General-purpose applications |
|
|
212
|
+
| **Star Schema (Denormalized)** | Poor (sync copies) | Excellent | Requires discipline | Low | Analytics, data warehouses |
|
|
213
|
+
| **Document Store (Schemaless)** | Excellent | Good for single doc | App-enforced only | Excellent | Rapid prototyping, CMS |
|
|
214
|
+
| **Graph Model** | Moderate | Excellent traversal | Good | Good | Social networks, knowledge graphs |
|
|
215
|
+
| **EAV** | Good | Terrible | None | Excellent | Almost never -- use JSONB instead |
|
|
216
|
+
| **Event Sourced** | Excellent (append) | Depends on projections | Excellent (immutable) | Good | Financial, audit-critical |
|
|
217
|
+
| **Hybrid (CQRS)** | Excellent | Excellent | Eventual consistency | Good | High-scale distinct read/write |
|
|
218
|
+
|
|
219
|
+
---
|
|
220
|
+
|
|
221
|
+
## Evolution Path
|
|
222
|
+
|
|
223
|
+
### Stage 1: Single-Database Monolith
|
|
224
|
+
One database, ORM migrations, all tables in one schema. **Evolve when:** queries degrade,
|
|
225
|
+
teams conflict on schema changes, read/write workloads compete.
|
|
226
|
+
|
|
227
|
+
### Stage 2: Read Replicas and Materialized Views
|
|
228
|
+
Add read replicas for reports/dashboards. Route reads to replicas, writes to primary.
|
|
229
|
+
**Evolve when:** replication lag causes stale reads in critical paths.
|
|
230
|
+
|
|
231
|
+
### Stage 3: Schema Migration Discipline
|
|
232
|
+
Adopt expand-contract for all changes. Use pgroll, gh-ost, or pt-online-schema-change.
|
|
233
|
+
Backward-compatible migrations only. **Evolve when:** different parts of the app need
|
|
234
|
+
fundamentally different data access patterns.
|
|
235
|
+
|
|
236
|
+
### Stage 4: Polyglot Persistence
|
|
237
|
+
Right database per workload: PostgreSQL for OLTP, ClickHouse for analytics, Elasticsearch
|
|
238
|
+
for search. CDC (Debezium) keeps stores synchronized. **Evolve when:** services grow too
|
|
239
|
+
large, data ownership unclear.
|
|
240
|
+
|
|
241
|
+
### Stage 5: Database-per-Service
|
|
242
|
+
Each service owns its schema exclusively. Cross-service data via APIs or events, never
|
|
243
|
+
direct SQL. **Evolve when:** cross-service queries become complex.
|
|
244
|
+
|
|
245
|
+
### Stage 6: Data Mesh
|
|
246
|
+
Domain teams own data as products. Federated governance ensures interoperability. Not every
|
|
247
|
+
organization reaches or needs this stage.
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
## Failure Modes
|
|
252
|
+
|
|
253
|
+
### 1. The God Table
|
|
254
|
+
A single table with 80+ columns used by every feature. ALTER TABLE takes hours at 200M rows.
|
|
255
|
+
**Fix:** Vertical partitioning into focused tables joined by the same primary key.
|
|
256
|
+
|
|
257
|
+
### 2. The EAV Anti-Pattern
|
|
258
|
+
A three-column table (`entity_id`, `attribute_name`, `attribute_value`) with no type safety,
|
|
259
|
+
no foreign keys, no constraints. Cybertec documented EAV queries requiring 15-20 self-joins,
|
|
260
|
+
running 100-1000x slower than normalized equivalents.
|
|
261
|
+
**Fix:** Use PostgreSQL JSONB with GIN indexes and check constraints:
|
|
262
|
+
```sql
|
|
263
|
+
CREATE TABLE products (
|
|
264
|
+
id bigint PRIMARY KEY, name text NOT NULL,
|
|
265
|
+
attributes jsonb NOT NULL DEFAULT '{}',
|
|
266
|
+
CONSTRAINT valid_attrs CHECK (jsonb_typeof(attributes) = 'object')
|
|
267
|
+
);
|
|
268
|
+
CREATE INDEX idx_products_attrs ON products USING gin (attributes);
|
|
269
|
+
SELECT * FROM products WHERE attributes @> '{"color": "red"}';
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### 3. Missing FK Indexes
|
|
273
|
+
JOIN queries take seconds instead of milliseconds. The number-one production performance
|
|
274
|
+
issue (Percona, pganalyze). A missing index on a 10M-row FK column turns a 2ms lookup into
|
|
275
|
+
a 5-second sequential scan.
|
|
276
|
+
**Fix:** Audit all foreign key columns and add indexes.
|
|
277
|
+
|
|
278
|
+
### 4. N+1 Query Pattern
|
|
279
|
+
A page load generates 100+ queries. Application fetches parents then loops to fetch children.
|
|
280
|
+
**Fix:** Eager loading (JOIN FETCH, prefetch_related), or denormalize co-accessed data.
|
|
281
|
+
|
|
282
|
+
### 5. UUIDv4 as Primary Key in InnoDB
|
|
283
|
+
Insert throughput degrades as tables grow. PlanetScale documented 3-5x improvement switching
|
|
284
|
+
to UUIDv7, and an order-of-magnitude reduction in WAL volume at 100M+ rows.
|
|
285
|
+
**Fix:** UUIDv7, ULID, or Snowflake IDs. Or use UUIDv4 as a secondary unique column with
|
|
286
|
+
bigint as clustered PK.
|
|
287
|
+
|
|
288
|
+
### 6. Premature Denormalization
|
|
289
|
+
Data inconsistencies between redundant copies. Complex sync logic. Totals that do not match
|
|
290
|
+
line-item sums.
|
|
291
|
+
**Fix:** Start normalized. Measure under realistic load. Denormalize only proven bottlenecks.
|
|
292
|
+
|
|
293
|
+
### 7. Ignoring Temporal Data
|
|
294
|
+
No way to answer "what was the price when the order was placed?" History overwritten.
|
|
295
|
+
**Fix:** Snapshot columns (`order_items.unit_price`), history tables with `valid_from`/
|
|
296
|
+
`valid_to`, or event sourcing.
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## Technology Landscape
|
|
301
|
+
|
|
302
|
+
### Relational Databases
|
|
303
|
+
|
|
304
|
+
| Database | Strengths | Watch Out For |
|
|
305
|
+
|----------|-----------|---------------|
|
|
306
|
+
| **PostgreSQL** | JSONB, partial indexes, materialized views, UUIDv7 (v17+) | VACUUM management at scale |
|
|
307
|
+
| **MySQL/InnoDB** | Wide ecosystem, good simple-schema perf | Clustered PK (UUID trap), weaker constraints pre-8.0 |
|
|
308
|
+
| **SQLite** | Zero-config, embedded/edge | Single-writer, not for server workloads |
|
|
309
|
+
|
|
310
|
+
### Migration Tools
|
|
311
|
+
|
|
312
|
+
| Tool | Database | Key Feature |
|
|
313
|
+
|------|----------|-------------|
|
|
314
|
+
| **Flyway** | Multi-DB | SQL-based, version-numbered |
|
|
315
|
+
| **Alembic** | PostgreSQL/MySQL | Python, auto-generates from model diffs |
|
|
316
|
+
| **pgroll** | PostgreSQL | Automated expand-contract, zero-downtime |
|
|
317
|
+
| **gh-ost** | MySQL | GitHub's online schema migration |
|
|
318
|
+
| **Atlas** | Multi-DB | HCL declarative schema, plan + apply |
|
|
319
|
+
| **Prisma Migrate** | Multi-DB | TypeScript, declarative with generated migrations |
|
|
320
|
+
|
|
321
|
+
### ER Diagramming Tools
|
|
322
|
+
|
|
323
|
+
| Tool | Notes |
|
|
324
|
+
|------|-------|
|
|
325
|
+
| **dbdiagram.io** | DSL-based (DBML), fast iteration, SQL export |
|
|
326
|
+
| **pgModeler** | PostgreSQL-specific, reverse-engineers from live DB |
|
|
327
|
+
| **DBeaver** | ER diagrams from existing databases, multi-DB |
|
|
328
|
+
| **DataGrip** | JetBrains IDE with built-in ER visualization |
|
|
329
|
+
|
|
330
|
+
### ORMs
|
|
331
|
+
|
|
332
|
+
| Tool | Language | Note |
|
|
333
|
+
|------|----------|------|
|
|
334
|
+
| **SQLAlchemy** | Python | Declarative + imperative, complex relationships |
|
|
335
|
+
| **Prisma** | TypeScript | Declarative schema, typed client |
|
|
336
|
+
| **Hibernate/JPA** | Java | Annotation-based, table inheritance support |
|
|
337
|
+
| **ActiveRecord** | Ruby | Convention over configuration |
|
|
338
|
+
| **Ecto** | Elixir | Schema-based with changesets |
|
|
339
|
+
|
|
340
|
+
**ORM Warning:** ORMs mask data model problems. If your queries require N+1 workarounds or
|
|
341
|
+
raw SQL fallbacks, the underlying model likely needs restructuring.
|
|
342
|
+
|
|
343
|
+
---
|
|
344
|
+
|
|
345
|
+
## Decision Tree
|
|
346
|
+
|
|
347
|
+
```
|
|
348
|
+
START: You need to persist data for a new feature or system.
|
|
349
|
+
|
|
350
|
+
1. How well do you understand the domain?
|
|
351
|
+
+-- POORLY --> Domain-model first. Talk to experts. Do NOT start with DDL.
|
|
352
|
+
+-- WELL --> 2. Primary access pattern?
|
|
353
|
+
+-- WRITE-HEAVY --> Normalize to 3NF. Surrogate keys. Index FKs.
|
|
354
|
+
| +-- Need audit? --> History tables or event sourcing.
|
|
355
|
+
+-- READ-HEAVY --> Star schema or materialized views.
|
|
356
|
+
| +-- Real-time? --> CQRS with event-driven projections.
|
|
357
|
+
| +-- Batch? --> ETL to analytical store.
|
|
358
|
+
+-- MIXED --> 3NF writes + materialized views for reads.
|
|
359
|
+
+-- GRAPH-HEAVY --> Graph DB or recursive CTEs in PostgreSQL.
|
|
360
|
+
+-- VARIABLE SCHEMA --> PostgreSQL JSONB. NOT EAV. Never EAV.
|
|
361
|
+
|
|
362
|
+
3. Expected data volume?
|
|
363
|
+
+-- < 1M rows --> Almost any model works. Optimize for clarity.
|
|
364
|
+
+-- 1M - 100M --> Indexing strategy matters. Profile queries early.
|
|
365
|
+
+-- 100M - 1B --> Partitioning. UUIDv7 over UUIDv4. Online schema changes.
|
|
366
|
+
+-- > 1B rows --> Sharding. Globally unique keys. Distributed DB evaluation.
|
|
367
|
+
|
|
368
|
+
4. Regulatory compliance?
|
|
369
|
+
+-- GDPR --> Hard-delete capability. Separate PII tables.
|
|
370
|
+
+-- HIPAA --> Encrypt at rest/transit. Full change history.
|
|
371
|
+
+-- PCI-DSS --> Tokenize payments. Minimize cardholder data storage.
|
|
372
|
+
+-- SOX --> Immutable audit trail. No UPDATE/DELETE on financials.
|
|
373
|
+
```
|
|
374
|
+
|
|
375
|
+
---
|
|
376
|
+
|
|
377
|
+
## Implementation Sketch
|
|
378
|
+
|
|
379
|
+
### ER Diagram: E-Commerce Order System
|
|
380
|
+
|
|
381
|
+
```
|
|
382
|
+
┌─────────────┐
|
|
383
|
+
│ customers │
|
|
384
|
+
├─────────────┤ ┌──────────────┐
|
|
385
|
+
│ id (PK) │ │ products │
|
|
386
|
+
│ email (UQ) │ ├──────────────┤
|
|
387
|
+
│ name │ │ id (PK) │
|
|
388
|
+
│ created_at │ │ sku (UQ) │
|
|
389
|
+
│ deleted_at │ │ name │
|
|
390
|
+
└──────┬──────┘ │ current_price│
|
|
391
|
+
│ 1:M │ attributes │
|
|
392
|
+
┌──────┴──────┐ └──────┬───────┘
|
|
393
|
+
│ orders │ │ 1:M
|
|
394
|
+
├─────────────┤ ┌──────┴───────────┐
|
|
395
|
+
│ id (PK) │ │ order_items │
|
|
396
|
+
│ customer_id │──────────│ order_id (FK) │
|
|
397
|
+
│ status │ 1:M │ product_id (FK) │
|
|
398
|
+
│ total_amount│ │ quantity │
|
|
399
|
+
│ placed_at │ │ unit_price │
|
|
400
|
+
└─────────────┘ │ (snapshot) │
|
|
401
|
+
└──────────────────┘
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
### DDL (PostgreSQL)
|
|
405
|
+
|
|
406
|
+
```sql
|
|
407
|
+
CREATE TABLE customers (
|
|
408
|
+
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
409
|
+
public_id uuid NOT NULL DEFAULT gen_random_uuid() UNIQUE,
|
|
410
|
+
email text NOT NULL,
|
|
411
|
+
name text NOT NULL,
|
|
412
|
+
created_at timestamptz NOT NULL DEFAULT now(),
|
|
413
|
+
deleted_at timestamptz
|
|
414
|
+
);
|
|
415
|
+
CREATE UNIQUE INDEX idx_customers_email_active
|
|
416
|
+
ON customers (email) WHERE deleted_at IS NULL;
|
|
417
|
+
|
|
418
|
+
CREATE TABLE products (
|
|
419
|
+
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
420
|
+
sku text NOT NULL UNIQUE,
|
|
421
|
+
name text NOT NULL,
|
|
422
|
+
current_price numeric(12,2) NOT NULL CHECK (current_price >= 0),
|
|
423
|
+
attributes jsonb NOT NULL DEFAULT '{}',
|
|
424
|
+
created_at timestamptz NOT NULL DEFAULT now()
|
|
425
|
+
);
|
|
426
|
+
CREATE INDEX idx_products_attributes ON products USING gin (attributes);
|
|
427
|
+
|
|
428
|
+
CREATE TABLE orders (
|
|
429
|
+
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
430
|
+
public_id uuid NOT NULL DEFAULT gen_random_uuid() UNIQUE,
|
|
431
|
+
customer_id bigint NOT NULL REFERENCES customers(id),
|
|
432
|
+
status text NOT NULL DEFAULT 'draft'
|
|
433
|
+
CHECK (status IN ('draft','placed','paid','shipped',
|
|
434
|
+
'delivered','cancelled','refunded')),
|
|
435
|
+
total_amount numeric(12,2) NOT NULL DEFAULT 0 CHECK (total_amount >= 0),
|
|
436
|
+
placed_at timestamptz,
|
|
437
|
+
created_at timestamptz NOT NULL DEFAULT now()
|
|
438
|
+
);
|
|
439
|
+
CREATE INDEX idx_orders_customer_id ON orders (customer_id); -- FK index!
|
|
440
|
+
CREATE INDEX idx_orders_status ON orders (status);
|
|
441
|
+
|
|
442
|
+
CREATE TABLE order_items (
|
|
443
|
+
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
444
|
+
order_id bigint NOT NULL REFERENCES orders(id) ON DELETE CASCADE,
|
|
445
|
+
product_id bigint NOT NULL REFERENCES products(id),
|
|
446
|
+
quantity int NOT NULL CHECK (quantity > 0),
|
|
447
|
+
unit_price numeric(12,2) NOT NULL CHECK (unit_price >= 0), -- snapshot!
|
|
448
|
+
created_at timestamptz NOT NULL DEFAULT now(),
|
|
449
|
+
UNIQUE (order_id, product_id)
|
|
450
|
+
);
|
|
451
|
+
CREATE INDEX idx_order_items_order_id ON order_items (order_id);
|
|
452
|
+
CREATE INDEX idx_order_items_product_id ON order_items (product_id);
|
|
453
|
+
|
|
454
|
+
CREATE TABLE order_status_history (
|
|
455
|
+
id bigint GENERATED ALWAYS AS IDENTITY PRIMARY KEY,
|
|
456
|
+
order_id bigint NOT NULL REFERENCES orders(id) ON DELETE CASCADE,
|
|
457
|
+
old_status text,
|
|
458
|
+
new_status text NOT NULL,
|
|
459
|
+
changed_by text NOT NULL,
|
|
460
|
+
changed_at timestamptz NOT NULL DEFAULT now()
|
|
461
|
+
);
|
|
462
|
+
CREATE INDEX idx_osh_order_id ON order_status_history (order_id, changed_at);
|
|
463
|
+
```
|
|
464
|
+
|
|
465
|
+
### Migration Example (Expand-Contract)
|
|
466
|
+
|
|
467
|
+
```sql
|
|
468
|
+
-- Phase 1: EXPAND (non-blocking)
|
|
469
|
+
ALTER TABLE orders ADD COLUMN currency text DEFAULT 'USD';
|
|
470
|
+
-- Backfill in batches:
|
|
471
|
+
-- UPDATE orders SET currency='USD' WHERE currency IS NULL AND id BETWEEN :s AND :e;
|
|
472
|
+
|
|
473
|
+
-- Phase 2: MIGRATE (separate deploy) -- code reads from 'currency'
|
|
474
|
+
|
|
475
|
+
-- Phase 3: CONTRACT (separate deploy)
|
|
476
|
+
ALTER TABLE orders ALTER COLUMN currency SET NOT NULL;
|
|
477
|
+
```
|
|
478
|
+
|
|
479
|
+
---
|
|
480
|
+
|
|
481
|
+
## Cross-References
|
|
482
|
+
|
|
483
|
+
- **[sql-vs-nosql](sql-vs-nosql.md):** The data model drives the database choice, not the
|
|
484
|
+
reverse.
|
|
485
|
+
- **[data-consistency](data-consistency.md):** ACID vs. eventual consistency -- data model
|
|
486
|
+
decisions determine what consistency guarantees are possible.
|
|
487
|
+
- **[cqrs-event-sourcing](../../patterns/cqrs-event-sourcing.md):** When read and write
|
|
488
|
+
models diverge, CQRS separates them explicitly.
|
|
489
|
+
- **[database-scaling](../../scaling/database-scaling.md):** Sharding, partitioning,
|
|
490
|
+
replication -- physical decisions that become necessary at scale.
|
|
491
|
+
|
|
492
|
+
---
|
|
493
|
+
|
|
494
|
+
## Key Takeaways
|
|
495
|
+
|
|
496
|
+
1. **Model before you migrate.** 2-4 hours on a logical model prevents weeks of migration
|
|
497
|
+
pain after launch.
|
|
498
|
+
|
|
499
|
+
2. **Normalize first, denormalize deliberately.** Start at 3NF. Denormalize only proven
|
|
500
|
+
bottlenecks. Document every denormalization.
|
|
501
|
+
|
|
502
|
+
3. **Use UUIDv7 for new systems.** Combines distributed uniqueness with sequential insert
|
|
503
|
+
performance. Avoid UUIDv4 as a clustered primary key.
|
|
504
|
+
|
|
505
|
+
4. **Index your foreign keys.** Databases do not do this automatically. This is the single
|
|
506
|
+
most common production performance problem.
|
|
507
|
+
|
|
508
|
+
5. **Snapshot data at decision points.** Store `unit_price` at order time, not a pointer to
|
|
509
|
+
`current_price`. If you need "what was the value when this happened?", the data must
|
|
510
|
+
already be there.
|
|
511
|
+
|
|
512
|
+
6. **Never use EAV.** Use JSONB with GIN indexes instead. EAV trades every advantage of a
|
|
513
|
+
relational database for flexibility that JSONB provides better.
|
|
514
|
+
|
|
515
|
+
7. **Plan for schema evolution from day one.** Use expand-contract. Never remove a column in
|
|
516
|
+
the same deployment that stops writing to it.
|
|
517
|
+
|
|
518
|
+
8. **Your data model will outlive your application code.** Code gets rewritten; data persists.
|
|
519
|
+
Invest proportionally to its expected lifespan.
|
|
520
|
+
|
|
521
|
+
---
|
|
522
|
+
|
|
523
|
+
*Researched: 2026-03-08 | Sources:*
|
|
524
|
+
- *[ByteByteGo: Database Schema Design](https://blog.bytebytego.com/p/database-schema-design-simplified)*
|
|
525
|
+
- *[CelerData: Normalization vs Denormalization](https://celerdata.com/glossary/normalization-vs-denormalization-the-trade-offs-you-need-to-know)*
|
|
526
|
+
- *[PlanetScale: UUID Primary Keys in MySQL](https://planetscale.com/blog/the-problem-with-using-a-uuid-primary-key-in-mysql)*
|
|
527
|
+
- *[Bytebase: UUID vs Auto Increment](https://www.bytebase.com/blog/choose-primary-key-uuid-or-auto-increment/)*
|
|
528
|
+
- *[Cybertec: EAV in PostgreSQL](https://www.cybertec-postgresql.com/en/entity-attribute-value-eav-design-in-postgresql-dont-do-it/)*
|
|
529
|
+
- *[Bitestreams: 10 Data Modeling Mistakes](https://bitestreams.com/blog/10-data-modeling-mistakes/)*
|
|
530
|
+
- *[TDAN: Common Data Modeling Mistakes](https://tdan.com/common-data-modeling-mistakes-and-their-impact/24661)*
|
|
531
|
+
- *[Prisma: Expand and Contract Pattern](https://www.prisma.io/dataguide/types/relational/expand-and-contract-pattern)*
|
|
532
|
+
- *[Xata: pgroll Expand-Contract](https://xata.io/blog/pgroll-expand-contract)*
|
|
533
|
+
- *[Redgate: Database Design Patterns](https://www.red-gate.com/blog/database-design-patterns)*
|
|
534
|
+
- *[Databricks: Data Modeling on Modern Lakehouse](https://www.databricks.com/blog/data-modeling-best-practices-implementation-modern-lakehouse)*
|
|
535
|
+
- *[Marty Friedel: Soft vs Hard Delete](https://www.martyfriedel.com/blog/deleting-data-soft-hard-or-audit)*
|
|
536
|
+
- *[Saras Analytics: Data Modeling Best Practices](https://www.sarasanalytics.com/blog/data-modeling-best-practices)*
|