@mytechtoday/augment-extensions 0.1.2 → 0.4.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/README.md +614 -39
- package/augment-extensions/coding-standards/bash/README.md +196 -0
- package/augment-extensions/coding-standards/bash/module.json +163 -0
- package/augment-extensions/coding-standards/bash/rules/naming-conventions.md +336 -0
- package/augment-extensions/coding-standards/bash/rules/universal-standards.md +289 -0
- package/augment-extensions/coding-standards/css/README.md +40 -0
- package/augment-extensions/coding-standards/css/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/css/module.json +44 -0
- package/augment-extensions/coding-standards/css/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/css/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html/README.md +40 -0
- package/augment-extensions/coding-standards/html/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html/module.json +44 -0
- package/augment-extensions/coding-standards/html/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/README.md +194 -0
- package/augment-extensions/coding-standards/html-css-js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/html-css-js/examples/css-examples.css +550 -0
- package/augment-extensions/coding-standards/html-css-js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/html-css-js/examples/html-examples.html +267 -0
- package/augment-extensions/coding-standards/html-css-js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/html-css-js/examples/responsive-layout.html +505 -0
- package/augment-extensions/coding-standards/html-css-js/module.json +48 -0
- package/augment-extensions/coding-standards/html-css-js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-modern-features.md +448 -0
- package/augment-extensions/coding-standards/html-css-js/rules/css-standards.md +492 -0
- package/augment-extensions/coding-standards/html-css-js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/html-css-js/rules/html-standards.md +349 -0
- package/augment-extensions/coding-standards/html-css-js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/html-css-js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/html-css-js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/js/README.md +46 -0
- package/augment-extensions/coding-standards/js/examples/async-examples.js +487 -0
- package/augment-extensions/coding-standards/js/examples/dom-examples.js +667 -0
- package/augment-extensions/coding-standards/js/examples/javascript-examples.js +612 -0
- package/augment-extensions/coding-standards/js/module.json +49 -0
- package/augment-extensions/coding-standards/js/rules/async-patterns.md +515 -0
- package/augment-extensions/coding-standards/js/rules/dom-manipulation.md +439 -0
- package/augment-extensions/coding-standards/js/rules/javascript-standards.md +486 -0
- package/augment-extensions/coding-standards/js/rules/performance.md +463 -0
- package/augment-extensions/coding-standards/js/rules/tooling.md +543 -0
- package/augment-extensions/coding-standards/php/README.md +248 -0
- package/augment-extensions/coding-standards/php/examples/api-endpoint-example.php +204 -0
- package/augment-extensions/coding-standards/php/examples/cli-command-example.php +206 -0
- package/augment-extensions/coding-standards/php/examples/legacy-refactoring-example.php +234 -0
- package/augment-extensions/coding-standards/php/examples/web-application-example.php +211 -0
- package/augment-extensions/coding-standards/php/examples/woocommerce-extension-example.php +215 -0
- package/augment-extensions/coding-standards/php/examples/wordpress-plugin-example.php +189 -0
- package/augment-extensions/coding-standards/php/module.json +166 -0
- package/augment-extensions/coding-standards/php/rules/api-development.md +480 -0
- package/augment-extensions/coding-standards/php/rules/category-configuration.md +332 -0
- package/augment-extensions/coding-standards/php/rules/cli-tools.md +472 -0
- package/augment-extensions/coding-standards/php/rules/cms-integration.md +561 -0
- package/augment-extensions/coding-standards/php/rules/code-quality.md +402 -0
- package/augment-extensions/coding-standards/php/rules/documentation.md +425 -0
- package/augment-extensions/coding-standards/php/rules/ecommerce.md +627 -0
- package/augment-extensions/coding-standards/php/rules/error-handling.md +336 -0
- package/augment-extensions/coding-standards/php/rules/legacy-migration.md +677 -0
- package/augment-extensions/coding-standards/php/rules/naming-conventions.md +279 -0
- package/augment-extensions/coding-standards/php/rules/performance.md +392 -0
- package/augment-extensions/coding-standards/php/rules/psr-standards.md +186 -0
- package/augment-extensions/coding-standards/php/rules/security.md +358 -0
- package/augment-extensions/coding-standards/php/rules/testing.md +403 -0
- package/augment-extensions/coding-standards/php/rules/type-declarations.md +331 -0
- package/augment-extensions/coding-standards/php/rules/web-applications.md +426 -0
- package/augment-extensions/coding-standards/powershell/README.md +154 -0
- package/augment-extensions/coding-standards/powershell/examples/admin-example.ps1 +272 -0
- package/augment-extensions/coding-standards/powershell/examples/automation-example.ps1 +173 -0
- package/augment-extensions/coding-standards/powershell/examples/cloud-example.ps1 +243 -0
- package/augment-extensions/coding-standards/powershell/examples/cross-platform-example.ps1 +297 -0
- package/augment-extensions/coding-standards/powershell/examples/dsc-example.ps1 +224 -0
- package/augment-extensions/coding-standards/powershell/examples/legacy-migration-example.ps1 +340 -0
- package/augment-extensions/coding-standards/powershell/examples/module-example.psm1 +255 -0
- package/augment-extensions/coding-standards/powershell/module.json +165 -0
- package/augment-extensions/coding-standards/powershell/rules/administrative-tools.md +439 -0
- package/augment-extensions/coding-standards/powershell/rules/automation-scripts.md +240 -0
- package/augment-extensions/coding-standards/powershell/rules/cloud-orchestration.md +384 -0
- package/augment-extensions/coding-standards/powershell/rules/configuration-schema.md +383 -0
- package/augment-extensions/coding-standards/powershell/rules/cross-platform-scripts.md +482 -0
- package/augment-extensions/coding-standards/powershell/rules/dsc-configurations.md +296 -0
- package/augment-extensions/coding-standards/powershell/rules/error-handling.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/legacy-migrations.md +466 -0
- package/augment-extensions/coding-standards/powershell/rules/modules-functions.md +244 -0
- package/augment-extensions/coding-standards/powershell/rules/naming-conventions.md +266 -0
- package/augment-extensions/coding-standards/powershell/rules/performance-optimization.md +209 -0
- package/augment-extensions/coding-standards/powershell/rules/security-practices.md +314 -0
- package/augment-extensions/coding-standards/powershell/rules/testing-guidelines.md +268 -0
- package/augment-extensions/coding-standards/powershell/rules/universal-standards.md +197 -0
- package/augment-extensions/coding-standards/python/README.md +12 -8
- package/augment-extensions/coding-standards/python/examples/best-practices.py +373 -0
- package/augment-extensions/coding-standards/python/module.json +8 -4
- package/augment-extensions/coding-standards/python/rules/async-patterns.md +884 -0
- package/augment-extensions/coding-standards/python/rules/documentation.md +831 -0
- package/augment-extensions/coding-standards/python/rules/error-handling.md +855 -68
- package/augment-extensions/coding-standards/python/rules/testing.md +409 -0
- package/augment-extensions/coding-standards/python/rules/tooling.md +446 -0
- package/augment-extensions/coding-standards/python/rules/type-hints.md +115 -50
- package/augment-extensions/collections/html-css-js/README.md +82 -0
- package/augment-extensions/collections/html-css-js/collection.json +41 -0
- package/augment-extensions/domain-rules/database/README.md +161 -0
- package/augment-extensions/domain-rules/database/examples/flat-database-example.md +793 -0
- package/augment-extensions/domain-rules/database/examples/hybrid-database-example.md +1132 -0
- package/augment-extensions/domain-rules/database/examples/nosql-document-example.md +868 -0
- package/augment-extensions/domain-rules/database/examples/nosql-graph-example.md +805 -0
- package/augment-extensions/domain-rules/database/examples/relational-schema-example.md +621 -0
- package/augment-extensions/domain-rules/database/examples/vector-database-example.md +965 -0
- package/augment-extensions/domain-rules/database/module.json +28 -0
- package/augment-extensions/domain-rules/database/rules/flat-databases.md +624 -0
- package/augment-extensions/domain-rules/database/rules/nosql-databases.md +588 -0
- package/augment-extensions/domain-rules/database/rules/nosql-document-stores.md +856 -0
- package/augment-extensions/domain-rules/database/rules/nosql-graph-databases.md +778 -0
- package/augment-extensions/domain-rules/database/rules/nosql-key-value-stores.md +963 -0
- package/augment-extensions/domain-rules/database/rules/performance-optimization.md +1076 -0
- package/augment-extensions/domain-rules/database/rules/relational-databases.md +697 -0
- package/augment-extensions/domain-rules/database/rules/relational-indexing.md +671 -0
- package/augment-extensions/domain-rules/database/rules/relational-query-optimization.md +607 -0
- package/augment-extensions/domain-rules/database/rules/relational-schema-design.md +907 -0
- package/augment-extensions/domain-rules/database/rules/relational-transactions.md +783 -0
- package/augment-extensions/domain-rules/database/rules/security-standards.md +980 -0
- package/augment-extensions/domain-rules/database/rules/universal-best-practices.md +485 -0
- package/augment-extensions/domain-rules/database/rules/vector-databases.md +521 -0
- package/augment-extensions/domain-rules/database/rules/vector-embeddings.md +858 -0
- package/augment-extensions/domain-rules/database/rules/vector-indexing.md +934 -0
- package/augment-extensions/domain-rules/mcp/README.md +150 -0
- package/augment-extensions/domain-rules/mcp/examples/compressed-example.md +522 -0
- package/augment-extensions/domain-rules/mcp/examples/graph-augmented-example.md +520 -0
- package/augment-extensions/domain-rules/mcp/examples/hybrid-example.md +570 -0
- package/augment-extensions/domain-rules/mcp/examples/state-based-example.md +427 -0
- package/augment-extensions/domain-rules/mcp/examples/token-based-example.md +435 -0
- package/augment-extensions/domain-rules/mcp/examples/vector-based-example.md +502 -0
- package/augment-extensions/domain-rules/mcp/module.json +49 -0
- package/augment-extensions/domain-rules/mcp/rules/compressed-mcp.md +595 -0
- package/augment-extensions/domain-rules/mcp/rules/configuration.md +345 -0
- package/augment-extensions/domain-rules/mcp/rules/graph-augmented-mcp.md +687 -0
- package/augment-extensions/domain-rules/mcp/rules/hybrid-mcp.md +636 -0
- package/augment-extensions/domain-rules/mcp/rules/state-based-mcp.md +484 -0
- package/augment-extensions/domain-rules/mcp/rules/testing-validation.md +360 -0
- package/augment-extensions/domain-rules/mcp/rules/token-based-mcp.md +393 -0
- package/augment-extensions/domain-rules/mcp/rules/universal-rules.md +194 -0
- package/augment-extensions/domain-rules/mcp/rules/vector-based-mcp.md +625 -0
- package/augment-extensions/domain-rules/wordpress/README.md +163 -0
- package/augment-extensions/domain-rules/wordpress/module.json +32 -0
- package/augment-extensions/domain-rules/wordpress/rules/coding-standards.md +617 -0
- package/augment-extensions/domain-rules/wordpress/rules/directory-structure.md +270 -0
- package/augment-extensions/domain-rules/wordpress/rules/file-patterns.md +423 -0
- package/augment-extensions/domain-rules/wordpress/rules/gutenberg-blocks.md +493 -0
- package/augment-extensions/domain-rules/wordpress/rules/performance.md +568 -0
- package/augment-extensions/domain-rules/wordpress/rules/plugin-development.md +510 -0
- package/augment-extensions/domain-rules/wordpress/rules/project-detection.md +251 -0
- package/augment-extensions/domain-rules/wordpress/rules/rest-api.md +501 -0
- package/augment-extensions/domain-rules/wordpress/rules/security.md +564 -0
- package/augment-extensions/domain-rules/wordpress/rules/theme-development.md +388 -0
- package/augment-extensions/domain-rules/wordpress/rules/woocommerce.md +441 -0
- package/augment-extensions/domain-rules/wordpress-plugin/README.md +139 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/ajax-plugin.md +1599 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/custom-post-type-plugin.md +1727 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block-plugin.md +428 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block.md +422 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/mvc-plugin.md +1623 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/object-oriented-plugin.md +1343 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/rest-endpoint.md +734 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/settings-page-plugin.md +1350 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/simple-procedural-plugin.md +503 -0
- package/augment-extensions/domain-rules/wordpress-plugin/examples/singleton-plugin.md +971 -0
- package/augment-extensions/domain-rules/wordpress-plugin/module.json +53 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/activation-hooks.md +770 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/admin-interface.md +874 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/ajax-handlers.md +629 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/asset-management.md +559 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/context-providers.md +709 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/cron-jobs.md +736 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/database-management.md +1057 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/documentation-standards.md +463 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/frontend-functionality.md +478 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/gutenberg-blocks.md +818 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/internationalization.md +416 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/migration.md +667 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/performance-optimization.md +878 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-architecture.md +693 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-structure.md +352 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/rest-api.md +818 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/scaffolding-workflow.md +624 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/security-best-practices.md +866 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing-patterns.md +1165 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/testing.md +414 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/vscode-integration.md +751 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/woocommerce-integration.md +949 -0
- package/augment-extensions/domain-rules/wordpress-plugin/rules/wordpress-org-submission.md +458 -0
- package/augment-extensions/examples/gutenberg-block-plugin/README.md +101 -0
- package/augment-extensions/examples/gutenberg-block-plugin/examples/testimonial-block.md +428 -0
- package/augment-extensions/examples/gutenberg-block-plugin/module.json +40 -0
- package/augment-extensions/examples/rest-api-plugin/README.md +98 -0
- package/augment-extensions/examples/rest-api-plugin/examples/task-manager-api.md +1299 -0
- package/augment-extensions/examples/rest-api-plugin/module.json +40 -0
- package/augment-extensions/examples/woocommerce-extension/README.md +98 -0
- package/augment-extensions/examples/woocommerce-extension/examples/product-customizer.md +763 -0
- package/augment-extensions/examples/woocommerce-extension/module.json +40 -0
- package/augment-extensions/workflows/beads/module.json +4 -3
- package/augment-extensions/workflows/database/README.md +195 -0
- package/augment-extensions/workflows/database/ai-prompt-testing.md +295 -0
- package/augment-extensions/workflows/database/examples/migration-example.md +498 -0
- package/augment-extensions/workflows/database/examples/optimization-example.md +496 -0
- package/augment-extensions/workflows/database/examples/schema-design-example.md +444 -0
- package/augment-extensions/workflows/database/module.json +42 -0
- package/augment-extensions/workflows/database/rules/data-migration.md +249 -0
- package/augment-extensions/workflows/database/rules/documentation-standards.md +339 -0
- package/augment-extensions/workflows/database/rules/migration-workflow.md +352 -0
- package/augment-extensions/workflows/database/rules/optimization-workflow.md +435 -0
- package/augment-extensions/workflows/database/rules/schema-design-workflow.md +535 -0
- package/augment-extensions/workflows/database/rules/testing-patterns.md +305 -0
- package/augment-extensions/workflows/database/rules/workflow.md +458 -0
- package/augment-extensions/workflows/openspec/module.json +4 -3
- package/augment-extensions/workflows/wordpress-plugin/README.md +232 -0
- package/augment-extensions/workflows/wordpress-plugin/ai-prompts.md +839 -0
- package/augment-extensions/workflows/wordpress-plugin/bead-decomposition-patterns.md +854 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/complete-plugin-example.md +540 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/custom-post-type-example.md +1083 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/feature-addition-workflow.md +669 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/plugin-creation-workflow.md +597 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/secure-form-handler-example.md +925 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/security-audit-workflow.md +752 -0
- package/augment-extensions/workflows/wordpress-plugin/examples/wordpress-org-submission-workflow.md +773 -0
- package/augment-extensions/workflows/wordpress-plugin/module.json +49 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/best-practices.md +942 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/development-workflow.md +702 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/submission-workflow.md +728 -0
- package/augment-extensions/workflows/wordpress-plugin/rules/testing-workflow.md +775 -0
- package/augment-extensions/writing-standards/screenplay/README.md +171 -0
- package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -0
- package/augment-extensions/writing-standards/screenplay/module.json +124 -0
- package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -0
- package/cli/MODULES.md +302 -0
- package/cli/dist/cli.js +142 -9
- package/cli/dist/cli.js.map +1 -1
- package/cli/dist/commands/catalog.d.ts +13 -0
- package/cli/dist/commands/catalog.d.ts.map +1 -0
- package/cli/dist/commands/catalog.js +104 -0
- package/cli/dist/commands/catalog.js.map +1 -0
- package/cli/dist/commands/gui.d.ts +6 -0
- package/cli/dist/commands/gui.d.ts.map +1 -0
- package/cli/dist/commands/gui.js +211 -0
- package/cli/dist/commands/gui.js.map +1 -0
- package/cli/dist/commands/init.d.ts.map +1 -1
- package/cli/dist/commands/init.js +12 -0
- package/cli/dist/commands/init.js.map +1 -1
- package/cli/dist/commands/install-rules.d.ts +14 -0
- package/cli/dist/commands/install-rules.d.ts.map +1 -0
- package/cli/dist/commands/install-rules.js +127 -0
- package/cli/dist/commands/install-rules.js.map +1 -0
- package/cli/dist/commands/link.d.ts.map +1 -1
- package/cli/dist/commands/link.js +9 -11
- package/cli/dist/commands/link.js.map +1 -1
- package/cli/dist/commands/list.d.ts.map +1 -1
- package/cli/dist/commands/list.js +11 -28
- package/cli/dist/commands/list.js.map +1 -1
- package/cli/dist/commands/mcp.d.ts +48 -0
- package/cli/dist/commands/mcp.d.ts.map +1 -0
- package/cli/dist/commands/mcp.js +229 -0
- package/cli/dist/commands/mcp.js.map +1 -0
- package/cli/dist/commands/self-remove.d.ts +7 -0
- package/cli/dist/commands/self-remove.d.ts.map +1 -0
- package/cli/dist/commands/self-remove.js +179 -0
- package/cli/dist/commands/self-remove.js.map +1 -0
- package/cli/dist/commands/show.d.ts.map +1 -1
- package/cli/dist/commands/show.js +42 -71
- package/cli/dist/commands/show.js.map +1 -1
- package/cli/dist/commands/skill.d.ts +67 -0
- package/cli/dist/commands/skill.d.ts.map +1 -0
- package/cli/dist/commands/skill.js +513 -0
- package/cli/dist/commands/skill.js.map +1 -0
- package/cli/dist/commands/unlink.d.ts +6 -0
- package/cli/dist/commands/unlink.d.ts.map +1 -0
- package/cli/dist/commands/unlink.js +115 -0
- package/cli/dist/commands/unlink.js.map +1 -0
- package/cli/dist/commands/validate.d.ts +6 -0
- package/cli/dist/commands/validate.d.ts.map +1 -0
- package/cli/dist/commands/validate.js +159 -0
- package/cli/dist/commands/validate.js.map +1 -0
- package/cli/dist/utils/catalog-sync.d.ts +22 -0
- package/cli/dist/utils/catalog-sync.d.ts.map +1 -0
- package/cli/dist/utils/catalog-sync.js +157 -0
- package/cli/dist/utils/catalog-sync.js.map +1 -0
- package/cli/dist/utils/character-count.d.ts +56 -0
- package/cli/dist/utils/character-count.d.ts.map +1 -0
- package/cli/dist/utils/character-count.js +190 -0
- package/cli/dist/utils/character-count.js.map +1 -0
- package/cli/dist/utils/documentation-validator.d.ts +18 -0
- package/cli/dist/utils/documentation-validator.d.ts.map +1 -0
- package/cli/dist/utils/documentation-validator.js +233 -0
- package/cli/dist/utils/documentation-validator.js.map +1 -0
- package/cli/dist/utils/install-rules.d.ts +32 -0
- package/cli/dist/utils/install-rules.d.ts.map +1 -0
- package/cli/dist/utils/install-rules.js +375 -0
- package/cli/dist/utils/install-rules.js.map +1 -0
- package/cli/dist/utils/mcp-integration.d.ts +70 -0
- package/cli/dist/utils/mcp-integration.d.ts.map +1 -0
- package/cli/dist/utils/mcp-integration.js +292 -0
- package/cli/dist/utils/mcp-integration.js.map +1 -0
- package/cli/dist/utils/module-system.d.ts +153 -0
- package/cli/dist/utils/module-system.d.ts.map +1 -0
- package/cli/dist/utils/module-system.js +528 -0
- package/cli/dist/utils/module-system.js.map +1 -0
- package/cli/dist/utils/modules-catalog.d.ts +33 -0
- package/cli/dist/utils/modules-catalog.d.ts.map +1 -0
- package/cli/dist/utils/modules-catalog.js +163 -0
- package/cli/dist/utils/modules-catalog.js.map +1 -0
- package/cli/dist/utils/rule-install-hooks.d.ts +19 -0
- package/cli/dist/utils/rule-install-hooks.d.ts.map +1 -0
- package/cli/dist/utils/rule-install-hooks.js +224 -0
- package/cli/dist/utils/rule-install-hooks.js.map +1 -0
- package/cli/dist/utils/skill-system.d.ts +95 -0
- package/cli/dist/utils/skill-system.d.ts.map +1 -0
- package/cli/dist/utils/skill-system.js +313 -0
- package/cli/dist/utils/skill-system.js.map +1 -0
- package/modules.md +534 -70
- package/package.json +12 -3
|
@@ -0,0 +1,907 @@
|
|
|
1
|
+
# Relational Schema Design
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
This document covers relational database schema design principles, including entity-relationship modeling, normalization, denormalization strategies, keys, constraints, data types, naming conventions, and schema evolution.
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## Entity-Relationship Modeling
|
|
10
|
+
|
|
11
|
+
### Identifying Entities
|
|
12
|
+
|
|
13
|
+
**Entity**: A thing or object in the real world with independent existence
|
|
14
|
+
|
|
15
|
+
**Examples:**
|
|
16
|
+
- User
|
|
17
|
+
- Product
|
|
18
|
+
- Order
|
|
19
|
+
- Category
|
|
20
|
+
- Payment
|
|
21
|
+
|
|
22
|
+
**Guidelines:**
|
|
23
|
+
- ✅ Entities should represent distinct concepts
|
|
24
|
+
- ✅ Entities should have attributes
|
|
25
|
+
- ✅ Entities should have a unique identifier
|
|
26
|
+
- ❌ Avoid creating entities for simple attributes
|
|
27
|
+
|
|
28
|
+
### Identifying Relationships
|
|
29
|
+
|
|
30
|
+
**Relationship types:**
|
|
31
|
+
- **One-to-One (1:1)**: User ↔ Profile
|
|
32
|
+
- **One-to-Many (1:N)**: User → Orders
|
|
33
|
+
- **Many-to-Many (M:N)**: Products ↔ Categories
|
|
34
|
+
|
|
35
|
+
**Example: E-commerce ERD**
|
|
36
|
+
```
|
|
37
|
+
User (1) ──→ (N) Order
|
|
38
|
+
Order (1) ──→ (N) OrderItem
|
|
39
|
+
Product (1) ──→ (N) OrderItem
|
|
40
|
+
Category (1) ──→ (N) Product
|
|
41
|
+
Product (N) ←──→ (N) Tag [via ProductTag junction table]
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Cardinality and Participation
|
|
45
|
+
|
|
46
|
+
**Cardinality**: Number of instances in relationship
|
|
47
|
+
- Minimum cardinality: 0 (optional) or 1 (mandatory)
|
|
48
|
+
- Maximum cardinality: 1 or N (many)
|
|
49
|
+
|
|
50
|
+
**Example:**
|
|
51
|
+
- User (1) → (0..N) Orders: User can have zero or many orders
|
|
52
|
+
- Order (1) → (1..N) OrderItems: Order must have at least one item
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
|
|
56
|
+
## Normalization
|
|
57
|
+
|
|
58
|
+
### Purpose of Normalization
|
|
59
|
+
|
|
60
|
+
**Goals:**
|
|
61
|
+
- ✅ Eliminate data redundancy
|
|
62
|
+
- ✅ Ensure data integrity
|
|
63
|
+
- ✅ Reduce update anomalies
|
|
64
|
+
- ✅ Improve data consistency
|
|
65
|
+
|
|
66
|
+
### First Normal Form (1NF)
|
|
67
|
+
|
|
68
|
+
**Rules:**
|
|
69
|
+
- Each column contains atomic (indivisible) values
|
|
70
|
+
- Each column contains values of a single type
|
|
71
|
+
- Each column has a unique name
|
|
72
|
+
- Order of rows doesn't matter
|
|
73
|
+
|
|
74
|
+
**Violation Example:**
|
|
75
|
+
```sql
|
|
76
|
+
-- ❌ NOT in 1NF (phone_numbers contains multiple values)
|
|
77
|
+
CREATE TABLE users (
|
|
78
|
+
id INT PRIMARY KEY,
|
|
79
|
+
name VARCHAR(255),
|
|
80
|
+
phone_numbers VARCHAR(255) -- "555-1234, 555-5678"
|
|
81
|
+
);
|
|
82
|
+
```
|
|
83
|
+
|
|
84
|
+
**1NF Solution:**
|
|
85
|
+
```sql
|
|
86
|
+
-- ✅ 1NF compliant
|
|
87
|
+
CREATE TABLE users (
|
|
88
|
+
id INT PRIMARY KEY,
|
|
89
|
+
name VARCHAR(255)
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
CREATE TABLE user_phones (
|
|
93
|
+
id INT PRIMARY KEY,
|
|
94
|
+
user_id INT REFERENCES users(id),
|
|
95
|
+
phone_number VARCHAR(20)
|
|
96
|
+
);
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Second Normal Form (2NF)
|
|
100
|
+
|
|
101
|
+
**Rules:**
|
|
102
|
+
- Must be in 1NF
|
|
103
|
+
- All non-key attributes must depend on the entire primary key (no partial dependencies)
|
|
104
|
+
|
|
105
|
+
**Violation Example:**
|
|
106
|
+
```sql
|
|
107
|
+
-- ❌ NOT in 2NF (product_name depends only on product_id, not on order_id)
|
|
108
|
+
CREATE TABLE order_items (
|
|
109
|
+
order_id INT,
|
|
110
|
+
product_id INT,
|
|
111
|
+
product_name VARCHAR(255), -- Partial dependency
|
|
112
|
+
quantity INT,
|
|
113
|
+
PRIMARY KEY (order_id, product_id)
|
|
114
|
+
);
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**2NF Solution:**
|
|
118
|
+
```sql
|
|
119
|
+
-- ✅ 2NF compliant
|
|
120
|
+
CREATE TABLE products (
|
|
121
|
+
id INT PRIMARY KEY,
|
|
122
|
+
name VARCHAR(255)
|
|
123
|
+
);
|
|
124
|
+
|
|
125
|
+
CREATE TABLE order_items (
|
|
126
|
+
order_id INT,
|
|
127
|
+
product_id INT REFERENCES products(id),
|
|
128
|
+
quantity INT,
|
|
129
|
+
PRIMARY KEY (order_id, product_id)
|
|
130
|
+
);
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### Third Normal Form (3NF)
|
|
134
|
+
|
|
135
|
+
**Rules:**
|
|
136
|
+
- Must be in 2NF
|
|
137
|
+
- No transitive dependencies (non-key attributes depend only on primary key)
|
|
138
|
+
|
|
139
|
+
**Violation Example:**
|
|
140
|
+
```sql
|
|
141
|
+
-- ❌ NOT in 3NF (city and state depend on zip_code, not on user_id)
|
|
142
|
+
CREATE TABLE users (
|
|
143
|
+
id INT PRIMARY KEY,
|
|
144
|
+
name VARCHAR(255),
|
|
145
|
+
zip_code VARCHAR(10),
|
|
146
|
+
city VARCHAR(100), -- Transitive dependency
|
|
147
|
+
state VARCHAR(50) -- Transitive dependency
|
|
148
|
+
);
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
**3NF Solution:**
|
|
152
|
+
```sql
|
|
153
|
+
-- ✅ 3NF compliant
|
|
154
|
+
CREATE TABLE zip_codes (
|
|
155
|
+
zip_code VARCHAR(10) PRIMARY KEY,
|
|
156
|
+
city VARCHAR(100),
|
|
157
|
+
state VARCHAR(50)
|
|
158
|
+
);
|
|
159
|
+
|
|
160
|
+
CREATE TABLE users (
|
|
161
|
+
id INT PRIMARY KEY,
|
|
162
|
+
name VARCHAR(255),
|
|
163
|
+
zip_code VARCHAR(10) REFERENCES zip_codes(zip_code)
|
|
164
|
+
);
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### Boyce-Codd Normal Form (BCNF)
|
|
168
|
+
|
|
169
|
+
**Rules:**
|
|
170
|
+
- Must be in 3NF
|
|
171
|
+
- Every determinant must be a candidate key
|
|
172
|
+
|
|
173
|
+
**When to use:**
|
|
174
|
+
- Rare cases where 3NF still has anomalies
|
|
175
|
+
- Most applications don't need BCNF
|
|
176
|
+
|
|
177
|
+
### Normalization Trade-offs
|
|
178
|
+
|
|
179
|
+
**Advantages:**
|
|
180
|
+
- ✅ Reduces data redundancy
|
|
181
|
+
- ✅ Improves data integrity
|
|
182
|
+
- ✅ Easier to maintain
|
|
183
|
+
- ✅ Smaller database size
|
|
184
|
+
|
|
185
|
+
**Disadvantages:**
|
|
186
|
+
- ❌ More complex queries (more JOINs)
|
|
187
|
+
- ❌ Potentially slower reads
|
|
188
|
+
- ❌ More tables to manage
|
|
189
|
+
|
|
190
|
+
---
|
|
191
|
+
|
|
192
|
+
## Denormalization Strategies
|
|
193
|
+
|
|
194
|
+
### When to Denormalize
|
|
195
|
+
|
|
196
|
+
**Consider denormalization when:**
|
|
197
|
+
- ✅ Read performance is critical
|
|
198
|
+
- ✅ Data is read much more than written
|
|
199
|
+
- ✅ Complex JOINs are causing performance issues
|
|
200
|
+
- ✅ Aggregations are expensive
|
|
201
|
+
- ✅ Reporting queries are slow
|
|
202
|
+
|
|
203
|
+
**Avoid denormalization when:**
|
|
204
|
+
- ❌ Data changes frequently
|
|
205
|
+
- ❌ Data consistency is critical
|
|
206
|
+
- ❌ Storage space is limited
|
|
207
|
+
- ❌ Write performance is more important than read performance
|
|
208
|
+
|
|
209
|
+
### Denormalization Techniques
|
|
210
|
+
|
|
211
|
+
#### 1. Add Redundant Columns
|
|
212
|
+
|
|
213
|
+
**Example: Store user name in orders table**
|
|
214
|
+
```sql
|
|
215
|
+
-- Normalized (requires JOIN)
|
|
216
|
+
CREATE TABLE users (
|
|
217
|
+
id INT PRIMARY KEY,
|
|
218
|
+
name VARCHAR(255)
|
|
219
|
+
);
|
|
220
|
+
|
|
221
|
+
CREATE TABLE orders (
|
|
222
|
+
id INT PRIMARY KEY,
|
|
223
|
+
user_id INT REFERENCES users(id)
|
|
224
|
+
);
|
|
225
|
+
|
|
226
|
+
-- Denormalized (no JOIN needed)
|
|
227
|
+
CREATE TABLE orders (
|
|
228
|
+
id INT PRIMARY KEY,
|
|
229
|
+
user_id INT REFERENCES users(id),
|
|
230
|
+
user_name VARCHAR(255) -- Redundant, but faster reads
|
|
231
|
+
);
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
#### 2. Precompute Aggregations
|
|
235
|
+
|
|
236
|
+
**Example: Store order count and total in users table**
|
|
237
|
+
```sql
|
|
238
|
+
-- Normalized (requires aggregation)
|
|
239
|
+
SELECT u.*, COUNT(o.id) AS order_count, SUM(o.total) AS total_spent
|
|
240
|
+
FROM users u
|
|
241
|
+
LEFT JOIN orders o ON o.user_id = u.id
|
|
242
|
+
GROUP BY u.id;
|
|
243
|
+
|
|
244
|
+
-- Denormalized (precomputed)
|
|
245
|
+
CREATE TABLE users (
|
|
246
|
+
id INT PRIMARY KEY,
|
|
247
|
+
name VARCHAR(255),
|
|
248
|
+
order_count INT DEFAULT 0,
|
|
249
|
+
total_spent DECIMAL(10, 2) DEFAULT 0
|
|
250
|
+
);
|
|
251
|
+
|
|
252
|
+
-- Update with triggers
|
|
253
|
+
CREATE TRIGGER update_user_stats
|
|
254
|
+
AFTER INSERT ON orders
|
|
255
|
+
FOR EACH ROW
|
|
256
|
+
BEGIN
|
|
257
|
+
UPDATE users
|
|
258
|
+
SET order_count = order_count + 1,
|
|
259
|
+
total_spent = total_spent + NEW.total
|
|
260
|
+
WHERE id = NEW.user_id;
|
|
261
|
+
END;
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
#### 3. Materialized Views
|
|
265
|
+
|
|
266
|
+
**Example: Precompute complex aggregations**
|
|
267
|
+
```sql
|
|
268
|
+
-- PostgreSQL: Materialized view
|
|
269
|
+
CREATE MATERIALIZED VIEW user_order_stats AS
|
|
270
|
+
SELECT
|
|
271
|
+
u.id AS user_id,
|
|
272
|
+
u.name,
|
|
273
|
+
u.email,
|
|
274
|
+
COUNT(o.id) AS total_orders,
|
|
275
|
+
SUM(o.total) AS total_spent,
|
|
276
|
+
MAX(o.created_at) AS last_order_date
|
|
277
|
+
FROM users u
|
|
278
|
+
LEFT JOIN orders o ON o.user_id = u.id
|
|
279
|
+
GROUP BY u.id, u.name, u.email;
|
|
280
|
+
|
|
281
|
+
-- Create index on materialized view
|
|
282
|
+
CREATE INDEX idx_user_order_stats_user_id ON user_order_stats(user_id);
|
|
283
|
+
|
|
284
|
+
-- Refresh materialized view
|
|
285
|
+
REFRESH MATERIALIZED VIEW user_order_stats;
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
---
|
|
289
|
+
|
|
290
|
+
## Primary and Foreign Keys
|
|
291
|
+
|
|
292
|
+
### Primary Keys
|
|
293
|
+
|
|
294
|
+
**Definition**: Unique identifier for each row in a table
|
|
295
|
+
|
|
296
|
+
**Types:**
|
|
297
|
+
- **Natural key**: Existing attribute (e.g., email, SSN)
|
|
298
|
+
- **Surrogate key**: Artificial identifier (e.g., auto-increment ID)
|
|
299
|
+
|
|
300
|
+
**Best Practices:**
|
|
301
|
+
- ✅ Use surrogate keys (auto-increment integers or UUIDs)
|
|
302
|
+
- ✅ Keep primary keys immutable
|
|
303
|
+
- ✅ Use smallest data type that fits
|
|
304
|
+
- ❌ Avoid composite primary keys unless necessary
|
|
305
|
+
- ❌ Avoid using business data as primary keys
|
|
306
|
+
|
|
307
|
+
**Example:**
|
|
308
|
+
```sql
|
|
309
|
+
-- Auto-increment integer (most common)
|
|
310
|
+
CREATE TABLE users (
|
|
311
|
+
id SERIAL PRIMARY KEY, -- PostgreSQL
|
|
312
|
+
-- id INT AUTO_INCREMENT PRIMARY KEY, -- MySQL
|
|
313
|
+
name VARCHAR(255)
|
|
314
|
+
);
|
|
315
|
+
|
|
316
|
+
-- UUID (for distributed systems)
|
|
317
|
+
CREATE TABLE users (
|
|
318
|
+
id UUID PRIMARY KEY DEFAULT gen_random_uuid(), -- PostgreSQL
|
|
319
|
+
name VARCHAR(255)
|
|
320
|
+
);
|
|
321
|
+
|
|
322
|
+
-- Composite primary key (for junction tables)
|
|
323
|
+
CREATE TABLE product_tags (
|
|
324
|
+
product_id INT REFERENCES products(id),
|
|
325
|
+
tag_id INT REFERENCES tags(id),
|
|
326
|
+
PRIMARY KEY (product_id, tag_id)
|
|
327
|
+
);
|
|
328
|
+
```
|
|
329
|
+
|
|
330
|
+
### Foreign Keys
|
|
331
|
+
|
|
332
|
+
**Definition**: Column that references primary key in another table
|
|
333
|
+
|
|
334
|
+
**Benefits:**
|
|
335
|
+
- ✅ Enforces referential integrity
|
|
336
|
+
- ✅ Prevents orphaned records
|
|
337
|
+
- ✅ Documents relationships
|
|
338
|
+
|
|
339
|
+
**Example:**
|
|
340
|
+
```sql
|
|
341
|
+
CREATE TABLE orders (
|
|
342
|
+
id SERIAL PRIMARY KEY,
|
|
343
|
+
user_id INT NOT NULL REFERENCES users(id),
|
|
344
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
345
|
+
);
|
|
346
|
+
|
|
347
|
+
-- With ON DELETE and ON UPDATE actions
|
|
348
|
+
CREATE TABLE orders (
|
|
349
|
+
id SERIAL PRIMARY KEY,
|
|
350
|
+
user_id INT NOT NULL REFERENCES users(id)
|
|
351
|
+
ON DELETE CASCADE -- Delete orders when user is deleted
|
|
352
|
+
ON UPDATE CASCADE, -- Update orders when user ID changes
|
|
353
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
354
|
+
);
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
**ON DELETE actions:**
|
|
358
|
+
- `CASCADE`: Delete child rows when parent is deleted
|
|
359
|
+
- `SET NULL`: Set foreign key to NULL when parent is deleted
|
|
360
|
+
- `SET DEFAULT`: Set foreign key to default value when parent is deleted
|
|
361
|
+
- `RESTRICT`: Prevent deletion of parent if children exist (default)
|
|
362
|
+
- `NO ACTION`: Same as RESTRICT
|
|
363
|
+
|
|
364
|
+
**ON UPDATE actions:**
|
|
365
|
+
- Same options as ON DELETE
|
|
366
|
+
|
|
367
|
+
---
|
|
368
|
+
|
|
369
|
+
## Constraints
|
|
370
|
+
|
|
371
|
+
### NOT NULL Constraint
|
|
372
|
+
|
|
373
|
+
**Ensures column cannot contain NULL values:**
|
|
374
|
+
|
|
375
|
+
```sql
|
|
376
|
+
CREATE TABLE users (
|
|
377
|
+
id SERIAL PRIMARY KEY,
|
|
378
|
+
email VARCHAR(255) NOT NULL,
|
|
379
|
+
name VARCHAR(255) NOT NULL,
|
|
380
|
+
bio TEXT -- Can be NULL
|
|
381
|
+
);
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
### UNIQUE Constraint
|
|
385
|
+
|
|
386
|
+
**Ensures column values are unique:**
|
|
387
|
+
|
|
388
|
+
```sql
|
|
389
|
+
CREATE TABLE users (
|
|
390
|
+
id SERIAL PRIMARY KEY,
|
|
391
|
+
email VARCHAR(255) UNIQUE NOT NULL,
|
|
392
|
+
username VARCHAR(50) UNIQUE NOT NULL
|
|
393
|
+
);
|
|
394
|
+
|
|
395
|
+
-- Composite unique constraint
|
|
396
|
+
CREATE TABLE user_preferences (
|
|
397
|
+
user_id INT REFERENCES users(id),
|
|
398
|
+
preference_key VARCHAR(50),
|
|
399
|
+
preference_value TEXT,
|
|
400
|
+
UNIQUE (user_id, preference_key)
|
|
401
|
+
);
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
### CHECK Constraint
|
|
405
|
+
|
|
406
|
+
**Ensures column values meet specific conditions:**
|
|
407
|
+
|
|
408
|
+
```sql
|
|
409
|
+
CREATE TABLE products (
|
|
410
|
+
id SERIAL PRIMARY KEY,
|
|
411
|
+
name VARCHAR(255) NOT NULL,
|
|
412
|
+
price DECIMAL(10, 2) CHECK (price >= 0),
|
|
413
|
+
stock INT CHECK (stock >= 0),
|
|
414
|
+
status VARCHAR(20) CHECK (status IN ('active', 'inactive', 'discontinued'))
|
|
415
|
+
);
|
|
416
|
+
|
|
417
|
+
-- Named constraint
|
|
418
|
+
CREATE TABLE accounts (
|
|
419
|
+
id SERIAL PRIMARY KEY,
|
|
420
|
+
balance DECIMAL(10, 2),
|
|
421
|
+
CONSTRAINT check_positive_balance CHECK (balance >= 0)
|
|
422
|
+
);
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
### DEFAULT Constraint
|
|
426
|
+
|
|
427
|
+
**Provides default value for column:**
|
|
428
|
+
|
|
429
|
+
```sql
|
|
430
|
+
CREATE TABLE orders (
|
|
431
|
+
id SERIAL PRIMARY KEY,
|
|
432
|
+
status VARCHAR(20) DEFAULT 'pending',
|
|
433
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
434
|
+
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
435
|
+
);
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
---
|
|
439
|
+
|
|
440
|
+
## Data Types Selection
|
|
441
|
+
|
|
442
|
+
### Numeric Types
|
|
443
|
+
|
|
444
|
+
**Integers:**
|
|
445
|
+
```sql
|
|
446
|
+
-- PostgreSQL
|
|
447
|
+
SMALLINT -- -32,768 to 32,767 (2 bytes)
|
|
448
|
+
INTEGER -- -2,147,483,648 to 2,147,483,647 (4 bytes)
|
|
449
|
+
BIGINT -- -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 (8 bytes)
|
|
450
|
+
|
|
451
|
+
-- MySQL
|
|
452
|
+
TINYINT -- -128 to 127 (1 byte)
|
|
453
|
+
SMALLINT -- -32,768 to 32,767 (2 bytes)
|
|
454
|
+
MEDIUMINT -- -8,388,608 to 8,388,607 (3 bytes)
|
|
455
|
+
INT -- -2,147,483,648 to 2,147,483,647 (4 bytes)
|
|
456
|
+
BIGINT -- -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 (8 bytes)
|
|
457
|
+
```
|
|
458
|
+
|
|
459
|
+
**Decimals:**
|
|
460
|
+
```sql
|
|
461
|
+
-- Fixed-point (exact)
|
|
462
|
+
DECIMAL(precision, scale) -- e.g., DECIMAL(10, 2) for money
|
|
463
|
+
NUMERIC(precision, scale) -- Same as DECIMAL
|
|
464
|
+
|
|
465
|
+
-- Floating-point (approximate)
|
|
466
|
+
REAL -- 4 bytes
|
|
467
|
+
DOUBLE PRECISION -- 8 bytes
|
|
468
|
+
```
|
|
469
|
+
|
|
470
|
+
**Best Practices:**
|
|
471
|
+
- ✅ Use DECIMAL for money (exact precision)
|
|
472
|
+
- ✅ Use smallest integer type that fits
|
|
473
|
+
- ✅ Use BIGINT for IDs in large tables
|
|
474
|
+
- ❌ Avoid FLOAT/REAL for financial data
|
|
475
|
+
|
|
476
|
+
### String Types
|
|
477
|
+
|
|
478
|
+
```sql
|
|
479
|
+
-- Fixed-length (padded with spaces)
|
|
480
|
+
CHAR(n) -- e.g., CHAR(2) for state codes
|
|
481
|
+
|
|
482
|
+
-- Variable-length (up to n characters)
|
|
483
|
+
VARCHAR(n) -- e.g., VARCHAR(255) for email
|
|
484
|
+
|
|
485
|
+
-- Unlimited length
|
|
486
|
+
TEXT -- PostgreSQL, MySQL
|
|
487
|
+
```
|
|
488
|
+
|
|
489
|
+
**Best Practices:**
|
|
490
|
+
- ✅ Use VARCHAR for variable-length strings
|
|
491
|
+
- ✅ Use TEXT for long content
|
|
492
|
+
- ✅ Use CHAR for fixed-length codes
|
|
493
|
+
- ✅ Set appropriate VARCHAR length (not always 255)
|
|
494
|
+
- ❌ Don't use CHAR for variable-length data
|
|
495
|
+
|
|
496
|
+
### Date and Time Types
|
|
497
|
+
|
|
498
|
+
```sql
|
|
499
|
+
DATE -- Date only (YYYY-MM-DD)
|
|
500
|
+
TIME -- Time only (HH:MM:SS)
|
|
501
|
+
TIMESTAMP -- Date and time with timezone
|
|
502
|
+
TIMESTAMPTZ -- Timestamp with timezone (PostgreSQL)
|
|
503
|
+
INTERVAL -- Time interval (PostgreSQL)
|
|
504
|
+
```
|
|
505
|
+
|
|
506
|
+
**Best Practices:**
|
|
507
|
+
- ✅ Use TIMESTAMP for created_at/updated_at
|
|
508
|
+
- ✅ Use TIMESTAMPTZ for timezone-aware timestamps
|
|
509
|
+
- ✅ Store dates in UTC
|
|
510
|
+
- ❌ Don't store dates as strings
|
|
511
|
+
|
|
512
|
+
### Boolean Type
|
|
513
|
+
|
|
514
|
+
```sql
|
|
515
|
+
BOOLEAN -- TRUE, FALSE, NULL
|
|
516
|
+
```
|
|
517
|
+
|
|
518
|
+
### JSON Types
|
|
519
|
+
|
|
520
|
+
```sql
|
|
521
|
+
-- PostgreSQL
|
|
522
|
+
JSON -- Text-based JSON (slower)
|
|
523
|
+
JSONB -- Binary JSON (faster, indexable)
|
|
524
|
+
|
|
525
|
+
-- MySQL
|
|
526
|
+
JSON -- Binary JSON (MySQL 5.7+)
|
|
527
|
+
```
|
|
528
|
+
|
|
529
|
+
**Best Practices:**
|
|
530
|
+
- ✅ Use JSONB in PostgreSQL (faster and indexable)
|
|
531
|
+
- ✅ Use JSON for semi-structured data
|
|
532
|
+
- ❌ Don't use JSON for structured relational data
|
|
533
|
+
|
|
534
|
+
---
|
|
535
|
+
|
|
536
|
+
## Naming Conventions
|
|
537
|
+
|
|
538
|
+
### Table Names
|
|
539
|
+
|
|
540
|
+
**Best Practices:**
|
|
541
|
+
- ✅ Use plural nouns: `users`, `orders`, `products`
|
|
542
|
+
- ✅ Use snake_case: `order_items`, `user_preferences`
|
|
543
|
+
- ✅ Be descriptive: `product_categories` not `prod_cats`
|
|
544
|
+
- ❌ Avoid prefixes: `tbl_users` (unnecessary)
|
|
545
|
+
|
|
546
|
+
### Column Names
|
|
547
|
+
|
|
548
|
+
**Best Practices:**
|
|
549
|
+
- ✅ Use snake_case: `first_name`, `created_at`
|
|
550
|
+
- ✅ Be descriptive: `email_address` not `email_addr`
|
|
551
|
+
- ✅ Use consistent naming: `created_at`, `updated_at` (not `creation_date`)
|
|
552
|
+
- ❌ Avoid reserved words: `user`, `order`, `select`
|
|
553
|
+
- ❌ Don't repeat table name: `users.user_name` → `users.name`
|
|
554
|
+
|
|
555
|
+
### Primary Key Names
|
|
556
|
+
|
|
557
|
+
**Best Practices:**
|
|
558
|
+
- ✅ Use `id` for primary key
|
|
559
|
+
- ✅ Or use `{table_name}_id`: `user_id`, `order_id`
|
|
560
|
+
|
|
561
|
+
### Foreign Key Names
|
|
562
|
+
|
|
563
|
+
**Best Practices:**
|
|
564
|
+
- ✅ Use `{referenced_table}_id`: `user_id`, `product_id`
|
|
565
|
+
- ✅ Be explicit for multiple references: `author_id`, `reviewer_id`
|
|
566
|
+
|
|
567
|
+
### Index Names
|
|
568
|
+
|
|
569
|
+
**Best Practices:**
|
|
570
|
+
- ✅ Use `idx_{table}_{columns}`: `idx_users_email`
|
|
571
|
+
- ✅ Use `idx_{table}_{columns}_{type}`: `idx_users_name_gin`
|
|
572
|
+
|
|
573
|
+
### Constraint Names
|
|
574
|
+
|
|
575
|
+
**Best Practices:**
|
|
576
|
+
- ✅ Use `{table}_{column}_{type}`: `users_email_unique`
|
|
577
|
+
- ✅ Use `fk_{table}_{referenced_table}`: `fk_orders_users`
|
|
578
|
+
- ✅ Use `check_{table}_{column}`: `check_products_price`
|
|
579
|
+
|
|
580
|
+
---
|
|
581
|
+
|
|
582
|
+
## Schema Evolution
|
|
583
|
+
|
|
584
|
+
### Migration Strategies
|
|
585
|
+
|
|
586
|
+
**Best Practices:**
|
|
587
|
+
- ✅ Use migration tools (Flyway, Liquibase, Alembic, Prisma Migrate)
|
|
588
|
+
- ✅ Version all schema changes
|
|
589
|
+
- ✅ Make migrations reversible (up/down migrations)
|
|
590
|
+
- ✅ Test migrations in staging before production
|
|
591
|
+
- ✅ Include migrations in version control
|
|
592
|
+
- ❌ Never manually modify production schemas
|
|
593
|
+
|
|
594
|
+
### Adding Columns
|
|
595
|
+
|
|
596
|
+
**Safe approach:**
|
|
597
|
+
```sql
|
|
598
|
+
-- Add nullable column (safe, no downtime)
|
|
599
|
+
ALTER TABLE users ADD COLUMN phone VARCHAR(20);
|
|
600
|
+
|
|
601
|
+
-- Add column with default (may lock table)
|
|
602
|
+
ALTER TABLE users ADD COLUMN status VARCHAR(20) DEFAULT 'active';
|
|
603
|
+
|
|
604
|
+
-- PostgreSQL: Add column with default (no lock in PG 11+)
|
|
605
|
+
ALTER TABLE users ADD COLUMN status VARCHAR(20) DEFAULT 'active';
|
|
606
|
+
```
|
|
607
|
+
|
|
608
|
+
**Best Practices:**
|
|
609
|
+
- ✅ Add columns as nullable first
|
|
610
|
+
- ✅ Backfill data in separate step
|
|
611
|
+
- ✅ Add NOT NULL constraint after backfill
|
|
612
|
+
- ❌ Don't add NOT NULL columns directly (causes downtime)
|
|
613
|
+
|
|
614
|
+
### Removing Columns
|
|
615
|
+
|
|
616
|
+
**Safe approach:**
|
|
617
|
+
```sql
|
|
618
|
+
-- Step 1: Stop using column in application code
|
|
619
|
+
-- Step 2: Deploy application
|
|
620
|
+
-- Step 3: Remove column
|
|
621
|
+
ALTER TABLE users DROP COLUMN phone;
|
|
622
|
+
```
|
|
623
|
+
|
|
624
|
+
**Best Practices:**
|
|
625
|
+
- ✅ Remove column usage from code first
|
|
626
|
+
- ✅ Wait for deployment before dropping column
|
|
627
|
+
- ✅ Consider soft delete (rename to `deprecated_column`)
|
|
628
|
+
- ❌ Don't drop columns still in use
|
|
629
|
+
|
|
630
|
+
### Renaming Columns
|
|
631
|
+
|
|
632
|
+
**Safe approach:**
|
|
633
|
+
```sql
|
|
634
|
+
-- Step 1: Add new column
|
|
635
|
+
ALTER TABLE users ADD COLUMN email_address VARCHAR(255);
|
|
636
|
+
|
|
637
|
+
-- Step 2: Backfill data
|
|
638
|
+
UPDATE users SET email_address = email;
|
|
639
|
+
|
|
640
|
+
-- Step 3: Update application to use new column
|
|
641
|
+
-- Step 4: Deploy application
|
|
642
|
+
-- Step 5: Drop old column
|
|
643
|
+
ALTER TABLE users DROP COLUMN email;
|
|
644
|
+
```
|
|
645
|
+
|
|
646
|
+
**Best Practices:**
|
|
647
|
+
- ✅ Use add + backfill + drop approach
|
|
648
|
+
- ✅ Avoid direct renames (causes downtime)
|
|
649
|
+
- ❌ Don't use ALTER TABLE RENAME COLUMN in production
|
|
650
|
+
|
|
651
|
+
### Changing Column Types
|
|
652
|
+
|
|
653
|
+
**Safe approach:**
|
|
654
|
+
```sql
|
|
655
|
+
-- Step 1: Add new column with new type
|
|
656
|
+
ALTER TABLE products ADD COLUMN price_new DECIMAL(10, 2);
|
|
657
|
+
|
|
658
|
+
-- Step 2: Backfill data
|
|
659
|
+
UPDATE products SET price_new = CAST(price AS DECIMAL(10, 2));
|
|
660
|
+
|
|
661
|
+
-- Step 3: Update application to use new column
|
|
662
|
+
-- Step 4: Deploy application
|
|
663
|
+
-- Step 5: Drop old column and rename new column
|
|
664
|
+
ALTER TABLE products DROP COLUMN price;
|
|
665
|
+
ALTER TABLE products RENAME COLUMN price_new TO price;
|
|
666
|
+
```
|
|
667
|
+
|
|
668
|
+
**Best Practices:**
|
|
669
|
+
- ✅ Use add + backfill + drop approach
|
|
670
|
+
- ✅ Test type conversion thoroughly
|
|
671
|
+
- ❌ Don't use ALTER TABLE ALTER COLUMN TYPE directly (locks table)
|
|
672
|
+
|
|
673
|
+
### Adding Indexes
|
|
674
|
+
|
|
675
|
+
**Safe approach:**
|
|
676
|
+
```sql
|
|
677
|
+
-- PostgreSQL: Create index concurrently (no lock)
|
|
678
|
+
CREATE INDEX CONCURRENTLY idx_users_email ON users(email);
|
|
679
|
+
|
|
680
|
+
-- MySQL: Create index (locks table)
|
|
681
|
+
CREATE INDEX idx_users_email ON users(email);
|
|
682
|
+
```
|
|
683
|
+
|
|
684
|
+
**Best Practices:**
|
|
685
|
+
- ✅ Use CONCURRENTLY in PostgreSQL
|
|
686
|
+
- ✅ Create indexes during low-traffic periods
|
|
687
|
+
- ✅ Monitor index creation progress
|
|
688
|
+
- ❌ Don't create indexes on large tables during peak hours
|
|
689
|
+
|
|
690
|
+
### Adding Foreign Keys
|
|
691
|
+
|
|
692
|
+
**Safe approach:**
|
|
693
|
+
```sql
|
|
694
|
+
-- Step 1: Add column
|
|
695
|
+
ALTER TABLE orders ADD COLUMN user_id INT;
|
|
696
|
+
|
|
697
|
+
-- Step 2: Backfill data
|
|
698
|
+
UPDATE orders SET user_id = (SELECT id FROM users WHERE users.email = orders.user_email);
|
|
699
|
+
|
|
700
|
+
-- Step 3: Add NOT NULL constraint
|
|
701
|
+
ALTER TABLE orders ALTER COLUMN user_id SET NOT NULL;
|
|
702
|
+
|
|
703
|
+
-- Step 4: Add foreign key constraint
|
|
704
|
+
ALTER TABLE orders ADD CONSTRAINT fk_orders_users
|
|
705
|
+
FOREIGN KEY (user_id) REFERENCES users(id);
|
|
706
|
+
```
|
|
707
|
+
|
|
708
|
+
**Best Practices:**
|
|
709
|
+
- ✅ Add column first, then constraint
|
|
710
|
+
- ✅ Validate data before adding constraint
|
|
711
|
+
- ✅ Use NOT VALID in PostgreSQL for large tables
|
|
712
|
+
- ❌ Don't add foreign keys without validating data
|
|
713
|
+
|
|
714
|
+
---
|
|
715
|
+
|
|
716
|
+
## Schema Design Checklist
|
|
717
|
+
|
|
718
|
+
### Planning Phase
|
|
719
|
+
|
|
720
|
+
- [ ] Identify all entities and relationships
|
|
721
|
+
- [ ] Define cardinality and participation
|
|
722
|
+
- [ ] Choose primary key strategy (surrogate vs natural)
|
|
723
|
+
- [ ] Identify all attributes
|
|
724
|
+
- [ ] Determine data types
|
|
725
|
+
- [ ] Plan for schema evolution
|
|
726
|
+
|
|
727
|
+
### Normalization Phase
|
|
728
|
+
|
|
729
|
+
- [ ] Ensure 1NF (atomic values)
|
|
730
|
+
- [ ] Ensure 2NF (no partial dependencies)
|
|
731
|
+
- [ ] Ensure 3NF (no transitive dependencies)
|
|
732
|
+
- [ ] Consider BCNF if needed
|
|
733
|
+
- [ ] Document denormalization decisions
|
|
734
|
+
|
|
735
|
+
### Constraints Phase
|
|
736
|
+
|
|
737
|
+
- [ ] Add NOT NULL constraints
|
|
738
|
+
- [ ] Add UNIQUE constraints
|
|
739
|
+
- [ ] Add CHECK constraints
|
|
740
|
+
- [ ] Add DEFAULT values
|
|
741
|
+
- [ ] Add foreign key constraints
|
|
742
|
+
- [ ] Define ON DELETE/ON UPDATE actions
|
|
743
|
+
|
|
744
|
+
### Indexing Phase
|
|
745
|
+
|
|
746
|
+
- [ ] Index primary keys (automatic)
|
|
747
|
+
- [ ] Index foreign keys
|
|
748
|
+
- [ ] Index frequently queried columns
|
|
749
|
+
- [ ] Index columns used in JOINs
|
|
750
|
+
- [ ] Index columns used in WHERE clauses
|
|
751
|
+
- [ ] Consider composite indexes
|
|
752
|
+
|
|
753
|
+
### Documentation Phase
|
|
754
|
+
|
|
755
|
+
- [ ] Document entity relationships (ERD)
|
|
756
|
+
- [ ] Document constraints and their purpose
|
|
757
|
+
- [ ] Document denormalization decisions
|
|
758
|
+
- [ ] Document migration strategy
|
|
759
|
+
- [ ] Document naming conventions
|
|
760
|
+
|
|
761
|
+
---
|
|
762
|
+
|
|
763
|
+
## Common Schema Patterns
|
|
764
|
+
|
|
765
|
+
### Soft Delete
|
|
766
|
+
|
|
767
|
+
**Pattern: Mark records as deleted instead of removing them**
|
|
768
|
+
|
|
769
|
+
```sql
|
|
770
|
+
CREATE TABLE users (
|
|
771
|
+
id SERIAL PRIMARY KEY,
|
|
772
|
+
email VARCHAR(255) UNIQUE NOT NULL,
|
|
773
|
+
name VARCHAR(255),
|
|
774
|
+
deleted_at TIMESTAMP,
|
|
775
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
776
|
+
);
|
|
777
|
+
|
|
778
|
+
-- Query active users
|
|
779
|
+
SELECT * FROM users WHERE deleted_at IS NULL;
|
|
780
|
+
|
|
781
|
+
-- Soft delete
|
|
782
|
+
UPDATE users SET deleted_at = CURRENT_TIMESTAMP WHERE id = 1;
|
|
783
|
+
|
|
784
|
+
-- Restore
|
|
785
|
+
UPDATE users SET deleted_at = NULL WHERE id = 1;
|
|
786
|
+
```
|
|
787
|
+
|
|
788
|
+
### Audit Trail
|
|
789
|
+
|
|
790
|
+
**Pattern: Track all changes to records**
|
|
791
|
+
|
|
792
|
+
```sql
|
|
793
|
+
CREATE TABLE users (
|
|
794
|
+
id SERIAL PRIMARY KEY,
|
|
795
|
+
email VARCHAR(255) UNIQUE NOT NULL,
|
|
796
|
+
name VARCHAR(255),
|
|
797
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
798
|
+
created_by INT REFERENCES users(id),
|
|
799
|
+
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
800
|
+
updated_by INT REFERENCES users(id)
|
|
801
|
+
);
|
|
802
|
+
|
|
803
|
+
-- Separate audit table
|
|
804
|
+
CREATE TABLE user_audit (
|
|
805
|
+
id SERIAL PRIMARY KEY,
|
|
806
|
+
user_id INT REFERENCES users(id),
|
|
807
|
+
action VARCHAR(20), -- INSERT, UPDATE, DELETE
|
|
808
|
+
old_values JSONB,
|
|
809
|
+
new_values JSONB,
|
|
810
|
+
changed_by INT REFERENCES users(id),
|
|
811
|
+
changed_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
812
|
+
);
|
|
813
|
+
```
|
|
814
|
+
|
|
815
|
+
### Polymorphic Associations
|
|
816
|
+
|
|
817
|
+
**Pattern: Associate records with multiple table types**
|
|
818
|
+
|
|
819
|
+
```sql
|
|
820
|
+
-- Comments can belong to posts or products
|
|
821
|
+
CREATE TABLE comments (
|
|
822
|
+
id SERIAL PRIMARY KEY,
|
|
823
|
+
commentable_type VARCHAR(50), -- 'post' or 'product'
|
|
824
|
+
commentable_id INT,
|
|
825
|
+
content TEXT,
|
|
826
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
827
|
+
);
|
|
828
|
+
|
|
829
|
+
-- Better approach: Use separate foreign keys
|
|
830
|
+
CREATE TABLE comments (
|
|
831
|
+
id SERIAL PRIMARY KEY,
|
|
832
|
+
post_id INT REFERENCES posts(id),
|
|
833
|
+
product_id INT REFERENCES products(id),
|
|
834
|
+
content TEXT,
|
|
835
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
836
|
+
CHECK (
|
|
837
|
+
(post_id IS NOT NULL AND product_id IS NULL) OR
|
|
838
|
+
(post_id IS NULL AND product_id IS NOT NULL)
|
|
839
|
+
)
|
|
840
|
+
);
|
|
841
|
+
```
|
|
842
|
+
|
|
843
|
+
### Self-Referencing Tables
|
|
844
|
+
|
|
845
|
+
**Pattern: Hierarchical data (categories, org charts)**
|
|
846
|
+
|
|
847
|
+
```sql
|
|
848
|
+
CREATE TABLE categories (
|
|
849
|
+
id SERIAL PRIMARY KEY,
|
|
850
|
+
name VARCHAR(255) NOT NULL,
|
|
851
|
+
parent_id INT REFERENCES categories(id),
|
|
852
|
+
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
|
|
853
|
+
);
|
|
854
|
+
|
|
855
|
+
-- Query with recursive CTE
|
|
856
|
+
WITH RECURSIVE category_tree AS (
|
|
857
|
+
-- Base case: root categories
|
|
858
|
+
SELECT id, name, parent_id, 0 AS level
|
|
859
|
+
FROM categories
|
|
860
|
+
WHERE parent_id IS NULL
|
|
861
|
+
|
|
862
|
+
UNION ALL
|
|
863
|
+
|
|
864
|
+
-- Recursive case: child categories
|
|
865
|
+
SELECT c.id, c.name, c.parent_id, ct.level + 1
|
|
866
|
+
FROM categories c
|
|
867
|
+
JOIN category_tree ct ON c.parent_id = ct.id
|
|
868
|
+
)
|
|
869
|
+
SELECT * FROM category_tree ORDER BY level, name;
|
|
870
|
+
```
|
|
871
|
+
|
|
872
|
+
### Many-to-Many with Attributes
|
|
873
|
+
|
|
874
|
+
**Pattern: Junction table with additional attributes**
|
|
875
|
+
|
|
876
|
+
```sql
|
|
877
|
+
CREATE TABLE students (
|
|
878
|
+
id SERIAL PRIMARY KEY,
|
|
879
|
+
name VARCHAR(255)
|
|
880
|
+
);
|
|
881
|
+
|
|
882
|
+
CREATE TABLE courses (
|
|
883
|
+
id SERIAL PRIMARY KEY,
|
|
884
|
+
name VARCHAR(255)
|
|
885
|
+
);
|
|
886
|
+
|
|
887
|
+
-- Junction table with enrollment date and grade
|
|
888
|
+
CREATE TABLE enrollments (
|
|
889
|
+
student_id INT REFERENCES students(id),
|
|
890
|
+
course_id INT REFERENCES courses(id),
|
|
891
|
+
enrolled_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
|
892
|
+
grade VARCHAR(2),
|
|
893
|
+
PRIMARY KEY (student_id, course_id)
|
|
894
|
+
);
|
|
895
|
+
```
|
|
896
|
+
|
|
897
|
+
---
|
|
898
|
+
|
|
899
|
+
## Related Documentation
|
|
900
|
+
|
|
901
|
+
- **relational-databases.md**: Relational database fundamentals
|
|
902
|
+
- **relational-indexing.md**: Indexing strategies
|
|
903
|
+
- **relational-query-optimization.md**: Query optimization
|
|
904
|
+
- **relational-transactions.md**: Transaction management
|
|
905
|
+
- **data-migration.md**: Migration strategies
|
|
906
|
+
- **universal-best-practices.md**: General database best practices
|
|
907
|
+
|