@mytechtoday/augment-extensions 0.5.0 → 1.2.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.
Files changed (523) hide show
  1. package/AGENTS.md +265 -232
  2. package/README.md +956 -771
  3. package/augment-extensions/coding-standards/bash/README.md +196 -196
  4. package/augment-extensions/coding-standards/bash/module.json +163 -163
  5. package/augment-extensions/coding-standards/bash/rules/naming-conventions.md +336 -336
  6. package/augment-extensions/coding-standards/bash/rules/universal-standards.md +289 -289
  7. package/augment-extensions/coding-standards/css/README.md +40 -40
  8. package/augment-extensions/coding-standards/css/examples/css-examples.css +550 -550
  9. package/augment-extensions/coding-standards/css/module.json +44 -44
  10. package/augment-extensions/coding-standards/css/rules/css-modern-features.md +448 -448
  11. package/augment-extensions/coding-standards/css/rules/css-standards.md +492 -492
  12. package/augment-extensions/coding-standards/html/README.md +40 -40
  13. package/augment-extensions/coding-standards/html/examples/html-examples.html +267 -267
  14. package/augment-extensions/coding-standards/html/examples/responsive-layout.html +505 -505
  15. package/augment-extensions/coding-standards/html/module.json +44 -44
  16. package/augment-extensions/coding-standards/html/rules/html-standards.md +349 -349
  17. package/augment-extensions/coding-standards/html-css-js/README.md +194 -194
  18. package/augment-extensions/coding-standards/html-css-js/examples/async-examples.js +487 -487
  19. package/augment-extensions/coding-standards/html-css-js/examples/css-examples.css +550 -550
  20. package/augment-extensions/coding-standards/html-css-js/examples/dom-examples.js +667 -667
  21. package/augment-extensions/coding-standards/html-css-js/examples/html-examples.html +267 -267
  22. package/augment-extensions/coding-standards/html-css-js/examples/javascript-examples.js +612 -612
  23. package/augment-extensions/coding-standards/html-css-js/examples/responsive-layout.html +505 -505
  24. package/augment-extensions/coding-standards/html-css-js/module.json +48 -48
  25. package/augment-extensions/coding-standards/html-css-js/rules/async-patterns.md +515 -515
  26. package/augment-extensions/coding-standards/html-css-js/rules/css-modern-features.md +448 -448
  27. package/augment-extensions/coding-standards/html-css-js/rules/css-standards.md +492 -492
  28. package/augment-extensions/coding-standards/html-css-js/rules/dom-manipulation.md +439 -439
  29. package/augment-extensions/coding-standards/html-css-js/rules/html-standards.md +349 -349
  30. package/augment-extensions/coding-standards/html-css-js/rules/javascript-standards.md +486 -486
  31. package/augment-extensions/coding-standards/html-css-js/rules/performance.md +463 -463
  32. package/augment-extensions/coding-standards/html-css-js/rules/tooling.md +543 -543
  33. package/augment-extensions/coding-standards/js/README.md +46 -46
  34. package/augment-extensions/coding-standards/js/examples/async-examples.js +487 -487
  35. package/augment-extensions/coding-standards/js/examples/dom-examples.js +667 -667
  36. package/augment-extensions/coding-standards/js/examples/javascript-examples.js +612 -612
  37. package/augment-extensions/coding-standards/js/module.json +49 -49
  38. package/augment-extensions/coding-standards/js/rules/async-patterns.md +515 -515
  39. package/augment-extensions/coding-standards/js/rules/dom-manipulation.md +439 -439
  40. package/augment-extensions/coding-standards/js/rules/javascript-standards.md +486 -486
  41. package/augment-extensions/coding-standards/js/rules/performance.md +463 -463
  42. package/augment-extensions/coding-standards/js/rules/tooling.md +543 -543
  43. package/augment-extensions/coding-standards/php/README.md +248 -248
  44. package/augment-extensions/coding-standards/php/examples/api-endpoint-example.php +204 -204
  45. package/augment-extensions/coding-standards/php/examples/cli-command-example.php +206 -206
  46. package/augment-extensions/coding-standards/php/examples/legacy-refactoring-example.php +234 -234
  47. package/augment-extensions/coding-standards/php/examples/web-application-example.php +211 -211
  48. package/augment-extensions/coding-standards/php/examples/woocommerce-extension-example.php +215 -215
  49. package/augment-extensions/coding-standards/php/examples/wordpress-plugin-example.php +189 -189
  50. package/augment-extensions/coding-standards/php/module.json +166 -166
  51. package/augment-extensions/coding-standards/php/rules/api-development.md +480 -480
  52. package/augment-extensions/coding-standards/php/rules/category-configuration.md +332 -332
  53. package/augment-extensions/coding-standards/php/rules/cli-tools.md +472 -472
  54. package/augment-extensions/coding-standards/php/rules/cms-integration.md +561 -561
  55. package/augment-extensions/coding-standards/php/rules/code-quality.md +402 -402
  56. package/augment-extensions/coding-standards/php/rules/documentation.md +425 -425
  57. package/augment-extensions/coding-standards/php/rules/ecommerce.md +627 -627
  58. package/augment-extensions/coding-standards/php/rules/error-handling.md +336 -336
  59. package/augment-extensions/coding-standards/php/rules/legacy-migration.md +677 -677
  60. package/augment-extensions/coding-standards/php/rules/naming-conventions.md +279 -279
  61. package/augment-extensions/coding-standards/php/rules/performance.md +392 -392
  62. package/augment-extensions/coding-standards/php/rules/psr-standards.md +186 -186
  63. package/augment-extensions/coding-standards/php/rules/security.md +358 -358
  64. package/augment-extensions/coding-standards/php/rules/testing.md +403 -403
  65. package/augment-extensions/coding-standards/php/rules/type-declarations.md +331 -331
  66. package/augment-extensions/coding-standards/php/rules/web-applications.md +426 -426
  67. package/augment-extensions/coding-standards/powershell/README.md +154 -154
  68. package/augment-extensions/coding-standards/powershell/examples/admin-example.ps1 +272 -272
  69. package/augment-extensions/coding-standards/powershell/examples/automation-example.ps1 +173 -173
  70. package/augment-extensions/coding-standards/powershell/examples/cloud-example.ps1 +243 -243
  71. package/augment-extensions/coding-standards/powershell/examples/cross-platform-example.ps1 +297 -297
  72. package/augment-extensions/coding-standards/powershell/examples/dsc-example.ps1 +224 -224
  73. package/augment-extensions/coding-standards/powershell/examples/legacy-migration-example.ps1 +340 -340
  74. package/augment-extensions/coding-standards/powershell/examples/module-example.psm1 +255 -255
  75. package/augment-extensions/coding-standards/powershell/module.json +165 -165
  76. package/augment-extensions/coding-standards/powershell/rules/administrative-tools.md +439 -439
  77. package/augment-extensions/coding-standards/powershell/rules/automation-scripts.md +240 -240
  78. package/augment-extensions/coding-standards/powershell/rules/cloud-orchestration.md +384 -384
  79. package/augment-extensions/coding-standards/powershell/rules/configuration-schema.md +383 -383
  80. package/augment-extensions/coding-standards/powershell/rules/cross-platform-scripts.md +482 -482
  81. package/augment-extensions/coding-standards/powershell/rules/dsc-configurations.md +296 -296
  82. package/augment-extensions/coding-standards/powershell/rules/error-handling.md +314 -314
  83. package/augment-extensions/coding-standards/powershell/rules/legacy-migrations.md +466 -466
  84. package/augment-extensions/coding-standards/powershell/rules/modules-functions.md +244 -244
  85. package/augment-extensions/coding-standards/powershell/rules/naming-conventions.md +266 -266
  86. package/augment-extensions/coding-standards/powershell/rules/performance-optimization.md +209 -209
  87. package/augment-extensions/coding-standards/powershell/rules/security-practices.md +314 -314
  88. package/augment-extensions/coding-standards/powershell/rules/testing-guidelines.md +268 -268
  89. package/augment-extensions/coding-standards/powershell/rules/universal-standards.md +197 -197
  90. package/augment-extensions/coding-standards/python/README.md +48 -48
  91. package/augment-extensions/coding-standards/python/examples/best-practices.py +373 -373
  92. package/augment-extensions/coding-standards/python/module.json +30 -30
  93. package/augment-extensions/coding-standards/python/rules/async-patterns.md +884 -884
  94. package/augment-extensions/coding-standards/python/rules/best-practices.md +232 -232
  95. package/augment-extensions/coding-standards/python/rules/code-organization.md +220 -220
  96. package/augment-extensions/coding-standards/python/rules/documentation.md +831 -831
  97. package/augment-extensions/coding-standards/python/rules/error-handling.md +1008 -1008
  98. package/augment-extensions/coding-standards/python/rules/naming-conventions.md +172 -172
  99. package/augment-extensions/coding-standards/python/rules/testing.md +409 -409
  100. package/augment-extensions/coding-standards/python/rules/tooling.md +446 -446
  101. package/augment-extensions/coding-standards/python/rules/type-hints.md +253 -253
  102. package/augment-extensions/coding-standards/react/README.md +45 -45
  103. package/augment-extensions/coding-standards/react/module.json +27 -27
  104. package/augment-extensions/coding-standards/react/rules/component-patterns.md +214 -214
  105. package/augment-extensions/coding-standards/react/rules/hooks-best-practices.md +235 -235
  106. package/augment-extensions/coding-standards/react/rules/performance.md +300 -300
  107. package/augment-extensions/coding-standards/react/rules/state-management.md +265 -265
  108. package/augment-extensions/coding-standards/react/rules/typescript-react.md +271 -271
  109. package/augment-extensions/coding-standards/typescript/README.md +45 -45
  110. package/augment-extensions/coding-standards/typescript/module.json +27 -27
  111. package/augment-extensions/coding-standards/typescript/rules/naming-conventions.md +225 -225
  112. package/augment-extensions/collections/html-css-js/README.md +82 -82
  113. package/augment-extensions/collections/html-css-js/collection.json +41 -41
  114. package/augment-extensions/domain-rules/api-design/README.md +41 -41
  115. package/augment-extensions/domain-rules/api-design/module.json +27 -27
  116. package/augment-extensions/domain-rules/api-design/rules/authentication.md +263 -263
  117. package/augment-extensions/domain-rules/api-design/rules/documentation.md +395 -395
  118. package/augment-extensions/domain-rules/api-design/rules/error-handling.md +290 -290
  119. package/augment-extensions/domain-rules/api-design/rules/graphql-api.md +313 -313
  120. package/augment-extensions/domain-rules/api-design/rules/rest-api.md +214 -214
  121. package/augment-extensions/domain-rules/api-design/rules/versioning.md +268 -268
  122. package/augment-extensions/domain-rules/database/README.md +161 -161
  123. package/augment-extensions/domain-rules/database/examples/flat-database-example.md +793 -793
  124. package/augment-extensions/domain-rules/database/examples/hybrid-database-example.md +1132 -1132
  125. package/augment-extensions/domain-rules/database/examples/nosql-document-example.md +868 -868
  126. package/augment-extensions/domain-rules/database/examples/nosql-graph-example.md +805 -805
  127. package/augment-extensions/domain-rules/database/examples/relational-schema-example.md +621 -621
  128. package/augment-extensions/domain-rules/database/examples/vector-database-example.md +965 -965
  129. package/augment-extensions/domain-rules/database/module.json +28 -28
  130. package/augment-extensions/domain-rules/database/rules/flat-databases.md +624 -624
  131. package/augment-extensions/domain-rules/database/rules/nosql-databases.md +588 -588
  132. package/augment-extensions/domain-rules/database/rules/nosql-document-stores.md +856 -856
  133. package/augment-extensions/domain-rules/database/rules/nosql-graph-databases.md +778 -778
  134. package/augment-extensions/domain-rules/database/rules/nosql-key-value-stores.md +963 -963
  135. package/augment-extensions/domain-rules/database/rules/performance-optimization.md +1076 -1076
  136. package/augment-extensions/domain-rules/database/rules/relational-databases.md +697 -697
  137. package/augment-extensions/domain-rules/database/rules/relational-indexing.md +671 -671
  138. package/augment-extensions/domain-rules/database/rules/relational-query-optimization.md +607 -607
  139. package/augment-extensions/domain-rules/database/rules/relational-schema-design.md +907 -907
  140. package/augment-extensions/domain-rules/database/rules/relational-transactions.md +783 -783
  141. package/augment-extensions/domain-rules/database/rules/security-standards.md +980 -980
  142. package/augment-extensions/domain-rules/database/rules/universal-best-practices.md +485 -485
  143. package/augment-extensions/domain-rules/database/rules/vector-databases.md +521 -521
  144. package/augment-extensions/domain-rules/database/rules/vector-embeddings.md +858 -858
  145. package/augment-extensions/domain-rules/database/rules/vector-indexing.md +934 -934
  146. package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/README.md +23 -23
  147. package/augment-extensions/domain-rules/design/color/themes/catppuccin-latte/module.json +26 -26
  148. package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/README.md +23 -23
  149. package/augment-extensions/domain-rules/design/color/themes/catppuccin-mocha/module.json +26 -26
  150. package/augment-extensions/domain-rules/design/color/themes/dracula/README.md +23 -23
  151. package/augment-extensions/domain-rules/design/color/themes/dracula/module.json +26 -26
  152. package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/README.md +23 -23
  153. package/augment-extensions/domain-rules/design/color/themes/gruvbox-dark/module.json +26 -26
  154. package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/README.md +23 -23
  155. package/augment-extensions/domain-rules/design/color/themes/gruvbox-light/module.json +26 -26
  156. package/augment-extensions/domain-rules/design/color/themes/high-contrast/README.md +27 -27
  157. package/augment-extensions/domain-rules/design/color/themes/high-contrast/module.json +26 -26
  158. package/augment-extensions/domain-rules/design/color/themes/monokai/README.md +23 -23
  159. package/augment-extensions/domain-rules/design/color/themes/monokai/module.json +26 -26
  160. package/augment-extensions/domain-rules/design/color/themes/nord/README.md +23 -23
  161. package/augment-extensions/domain-rules/design/color/themes/nord/module.json +26 -26
  162. package/augment-extensions/domain-rules/design/color/themes/one-dark/README.md +23 -23
  163. package/augment-extensions/domain-rules/design/color/themes/one-dark/module.json +26 -26
  164. package/augment-extensions/domain-rules/design/color/themes/one-light/README.md +23 -23
  165. package/augment-extensions/domain-rules/design/color/themes/one-light/module.json +26 -26
  166. package/augment-extensions/domain-rules/design/color/themes/solarized-dark/README.md +23 -23
  167. package/augment-extensions/domain-rules/design/color/themes/solarized-dark/module.json +26 -26
  168. package/augment-extensions/domain-rules/design/color/themes/solarized-light/README.md +23 -23
  169. package/augment-extensions/domain-rules/design/color/themes/solarized-light/module.json +26 -26
  170. package/augment-extensions/domain-rules/design/color/themes/tokyo-night/README.md +23 -23
  171. package/augment-extensions/domain-rules/design/color/themes/tokyo-night/module.json +26 -26
  172. package/augment-extensions/domain-rules/mcp/README.md +150 -150
  173. package/augment-extensions/domain-rules/mcp/examples/compressed-example.md +522 -522
  174. package/augment-extensions/domain-rules/mcp/examples/graph-augmented-example.md +520 -520
  175. package/augment-extensions/domain-rules/mcp/examples/hybrid-example.md +570 -570
  176. package/augment-extensions/domain-rules/mcp/examples/state-based-example.md +427 -427
  177. package/augment-extensions/domain-rules/mcp/examples/token-based-example.md +435 -435
  178. package/augment-extensions/domain-rules/mcp/examples/vector-based-example.md +502 -502
  179. package/augment-extensions/domain-rules/mcp/module.json +49 -49
  180. package/augment-extensions/domain-rules/mcp/rules/compressed-mcp.md +595 -595
  181. package/augment-extensions/domain-rules/mcp/rules/configuration.md +345 -345
  182. package/augment-extensions/domain-rules/mcp/rules/graph-augmented-mcp.md +687 -687
  183. package/augment-extensions/domain-rules/mcp/rules/hybrid-mcp.md +636 -636
  184. package/augment-extensions/domain-rules/mcp/rules/state-based-mcp.md +484 -484
  185. package/augment-extensions/domain-rules/mcp/rules/testing-validation.md +360 -360
  186. package/augment-extensions/domain-rules/mcp/rules/token-based-mcp.md +393 -393
  187. package/augment-extensions/domain-rules/mcp/rules/universal-rules.md +194 -194
  188. package/augment-extensions/domain-rules/mcp/rules/vector-based-mcp.md +625 -625
  189. package/augment-extensions/domain-rules/security/README.md +41 -41
  190. package/augment-extensions/domain-rules/security/module.json +28 -28
  191. package/augment-extensions/domain-rules/security/rules/authentication-security.md +361 -361
  192. package/augment-extensions/domain-rules/security/rules/encryption.md +208 -208
  193. package/augment-extensions/domain-rules/security/rules/input-validation.md +294 -294
  194. package/augment-extensions/domain-rules/security/rules/owasp-top-10.md +339 -339
  195. package/augment-extensions/domain-rules/security/rules/secure-coding.md +293 -293
  196. package/augment-extensions/domain-rules/security/rules/web-security.md +268 -268
  197. package/augment-extensions/domain-rules/seo-sales-marketing/ANNOUNCEMENT.md +143 -0
  198. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/README.md +140 -136
  199. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/SCHEMA-VALIDATION-REPORT.md +216 -216
  200. package/augment-extensions/domain-rules/seo-sales-marketing/TEST-VALIDATION.md +129 -0
  201. package/augment-extensions/domain-rules/seo-sales-marketing/USAGE-GUIDES.md +254 -0
  202. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/brand-kit-example.yaml +292 -292
  203. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/campaign-brief-example.yaml +389 -389
  204. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/content-calendar-example.yaml +643 -643
  205. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/email-newsletter-example.md +376 -376
  206. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/landing-page-example.md +934 -934
  207. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/ppc-ad-copy-example.md +301 -301
  208. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/seo-blog-post-example.md +347 -347
  209. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/examples/social-media-campaign-example.md +606 -606
  210. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/module.json +50 -50
  211. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/affiliate-influencer-marketing.md +593 -593
  212. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/asset-management.md +418 -418
  213. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/brand-consistency.md +210 -210
  214. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/content-marketing.md +337 -337
  215. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/conversion-optimization.md +455 -455
  216. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/direct-sales.md +499 -499
  217. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/email-marketing.md +439 -439
  218. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/legal-compliance.md +227 -227
  219. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/ppc-advertising.md +569 -569
  220. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/seo-optimization.md +470 -470
  221. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/social-media-marketing.md +414 -414
  222. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/rules/universal-marketing.md +177 -177
  223. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/asset-inventory.schema.json +247 -247
  224. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/brand-kit.schema.json +326 -326
  225. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/campaign-brief.schema.json +342 -342
  226. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/color-palette.schema.json +223 -223
  227. package/augment-extensions/domain-rules/{marketing-standards/seo-sales-marketing → seo-sales-marketing}/schemas/content-template.schema.json +383 -383
  228. package/augment-extensions/domain-rules/wordpress/README.md +163 -163
  229. package/augment-extensions/domain-rules/wordpress/module.json +32 -32
  230. package/augment-extensions/domain-rules/wordpress/rules/coding-standards.md +617 -617
  231. package/augment-extensions/domain-rules/wordpress/rules/directory-structure.md +270 -270
  232. package/augment-extensions/domain-rules/wordpress/rules/file-patterns.md +423 -423
  233. package/augment-extensions/domain-rules/wordpress/rules/gutenberg-blocks.md +493 -493
  234. package/augment-extensions/domain-rules/wordpress/rules/performance.md +568 -568
  235. package/augment-extensions/domain-rules/wordpress/rules/plugin-development.md +510 -510
  236. package/augment-extensions/domain-rules/wordpress/rules/project-detection.md +251 -251
  237. package/augment-extensions/domain-rules/wordpress/rules/rest-api.md +501 -501
  238. package/augment-extensions/domain-rules/wordpress/rules/security.md +564 -564
  239. package/augment-extensions/domain-rules/wordpress/rules/theme-development.md +388 -388
  240. package/augment-extensions/domain-rules/wordpress/rules/woocommerce.md +441 -441
  241. package/augment-extensions/domain-rules/wordpress-plugin/README.md +139 -139
  242. package/augment-extensions/domain-rules/wordpress-plugin/examples/ajax-plugin.md +1599 -1599
  243. package/augment-extensions/domain-rules/wordpress-plugin/examples/custom-post-type-plugin.md +1727 -1727
  244. package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block-plugin.md +428 -428
  245. package/augment-extensions/domain-rules/wordpress-plugin/examples/gutenberg-block.md +422 -422
  246. package/augment-extensions/domain-rules/wordpress-plugin/examples/mvc-plugin.md +1623 -1623
  247. package/augment-extensions/domain-rules/wordpress-plugin/examples/object-oriented-plugin.md +1343 -1343
  248. package/augment-extensions/domain-rules/wordpress-plugin/examples/rest-endpoint.md +734 -734
  249. package/augment-extensions/domain-rules/wordpress-plugin/examples/settings-page-plugin.md +1350 -1350
  250. package/augment-extensions/domain-rules/wordpress-plugin/examples/simple-procedural-plugin.md +503 -503
  251. package/augment-extensions/domain-rules/wordpress-plugin/examples/singleton-plugin.md +971 -971
  252. package/augment-extensions/domain-rules/wordpress-plugin/module.json +53 -53
  253. package/augment-extensions/domain-rules/wordpress-plugin/rules/activation-hooks.md +770 -770
  254. package/augment-extensions/domain-rules/wordpress-plugin/rules/admin-interface.md +874 -874
  255. package/augment-extensions/domain-rules/wordpress-plugin/rules/ajax-handlers.md +629 -629
  256. package/augment-extensions/domain-rules/wordpress-plugin/rules/asset-management.md +559 -559
  257. package/augment-extensions/domain-rules/wordpress-plugin/rules/context-providers.md +709 -709
  258. package/augment-extensions/domain-rules/wordpress-plugin/rules/cron-jobs.md +736 -736
  259. package/augment-extensions/domain-rules/wordpress-plugin/rules/database-management.md +1057 -1057
  260. package/augment-extensions/domain-rules/wordpress-plugin/rules/documentation-standards.md +463 -463
  261. package/augment-extensions/domain-rules/wordpress-plugin/rules/frontend-functionality.md +478 -478
  262. package/augment-extensions/domain-rules/wordpress-plugin/rules/gutenberg-blocks.md +818 -818
  263. package/augment-extensions/domain-rules/wordpress-plugin/rules/internationalization.md +416 -416
  264. package/augment-extensions/domain-rules/wordpress-plugin/rules/migration.md +667 -667
  265. package/augment-extensions/domain-rules/wordpress-plugin/rules/performance-optimization.md +878 -878
  266. package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-architecture.md +693 -693
  267. package/augment-extensions/domain-rules/wordpress-plugin/rules/plugin-structure.md +352 -352
  268. package/augment-extensions/domain-rules/wordpress-plugin/rules/rest-api.md +818 -818
  269. package/augment-extensions/domain-rules/wordpress-plugin/rules/scaffolding-workflow.md +624 -624
  270. package/augment-extensions/domain-rules/wordpress-plugin/rules/security-best-practices.md +866 -866
  271. package/augment-extensions/domain-rules/wordpress-plugin/rules/testing-patterns.md +1165 -1165
  272. package/augment-extensions/domain-rules/wordpress-plugin/rules/testing.md +414 -414
  273. package/augment-extensions/domain-rules/wordpress-plugin/rules/vscode-integration.md +751 -751
  274. package/augment-extensions/domain-rules/wordpress-plugin/rules/woocommerce-integration.md +949 -949
  275. package/augment-extensions/domain-rules/wordpress-plugin/rules/wordpress-org-submission.md +458 -458
  276. package/augment-extensions/examples/design-patterns/README.md +37 -37
  277. package/augment-extensions/examples/design-patterns/examples/behavioral-patterns.md +370 -370
  278. package/augment-extensions/examples/design-patterns/examples/creational-patterns.md +250 -250
  279. package/augment-extensions/examples/design-patterns/examples/structural-patterns.md +264 -264
  280. package/augment-extensions/examples/design-patterns/module.json +27 -27
  281. package/augment-extensions/examples/gutenberg-block-plugin/README.md +101 -101
  282. package/augment-extensions/examples/gutenberg-block-plugin/examples/testimonial-block.md +428 -428
  283. package/augment-extensions/examples/gutenberg-block-plugin/module.json +40 -40
  284. package/augment-extensions/examples/rest-api-plugin/README.md +98 -98
  285. package/augment-extensions/examples/rest-api-plugin/examples/task-manager-api.md +1299 -1299
  286. package/augment-extensions/examples/rest-api-plugin/module.json +40 -40
  287. package/augment-extensions/examples/woocommerce-extension/README.md +98 -98
  288. package/augment-extensions/examples/woocommerce-extension/examples/product-customizer.md +763 -763
  289. package/augment-extensions/examples/woocommerce-extension/module.json +40 -40
  290. package/augment-extensions/workflows/beads/README.md +135 -135
  291. package/augment-extensions/workflows/beads/examples/complete-workflow-example.md +278 -278
  292. package/augment-extensions/workflows/beads/module.json +55 -55
  293. package/augment-extensions/workflows/beads/rules/best-practices.md +398 -398
  294. package/augment-extensions/workflows/beads/rules/file-format.md +327 -327
  295. package/augment-extensions/workflows/beads/rules/manual-setup.md +315 -315
  296. package/augment-extensions/workflows/beads/rules/workflow.md +326 -326
  297. package/augment-extensions/workflows/beads-integration/IMPLEMENTATION-STATUS.md +145 -145
  298. package/augment-extensions/workflows/beads-integration/README.md +143 -143
  299. package/augment-extensions/workflows/beads-integration/config/defaults.json +32 -32
  300. package/augment-extensions/workflows/beads-integration/config/schema.json +140 -140
  301. package/augment-extensions/workflows/beads-integration/examples/basic-task-generation.md +293 -293
  302. package/augment-extensions/workflows/beads-integration/module.json +75 -75
  303. package/augment-extensions/workflows/beads-integration/rules/core-rules.md +219 -219
  304. package/augment-extensions/workflows/beads-integration/rules/effectiveness-standards.md +256 -256
  305. package/augment-extensions/workflows/beads-integration/rules/task-generation.md +607 -607
  306. package/augment-extensions/workflows/database/README.md +195 -195
  307. package/augment-extensions/workflows/database/ai-prompt-testing.md +295 -295
  308. package/augment-extensions/workflows/database/examples/migration-example.md +498 -498
  309. package/augment-extensions/workflows/database/examples/optimization-example.md +496 -496
  310. package/augment-extensions/workflows/database/examples/schema-design-example.md +444 -444
  311. package/augment-extensions/workflows/database/module.json +42 -42
  312. package/augment-extensions/workflows/database/rules/data-migration.md +249 -249
  313. package/augment-extensions/workflows/database/rules/documentation-standards.md +339 -339
  314. package/augment-extensions/workflows/database/rules/migration-workflow.md +352 -352
  315. package/augment-extensions/workflows/database/rules/optimization-workflow.md +435 -435
  316. package/augment-extensions/workflows/database/rules/schema-design-workflow.md +535 -535
  317. package/augment-extensions/workflows/database/rules/testing-patterns.md +305 -305
  318. package/augment-extensions/workflows/database/rules/workflow.md +458 -458
  319. package/augment-extensions/workflows/wordpress-plugin/README.md +232 -232
  320. package/augment-extensions/workflows/wordpress-plugin/ai-prompts.md +839 -839
  321. package/augment-extensions/workflows/wordpress-plugin/bead-decomposition-patterns.md +854 -854
  322. package/augment-extensions/workflows/wordpress-plugin/examples/complete-plugin-example.md +540 -540
  323. package/augment-extensions/workflows/wordpress-plugin/examples/custom-post-type-example.md +1083 -1083
  324. package/augment-extensions/workflows/wordpress-plugin/examples/feature-addition-workflow.md +669 -669
  325. package/augment-extensions/workflows/wordpress-plugin/examples/plugin-creation-workflow.md +597 -597
  326. package/augment-extensions/workflows/wordpress-plugin/examples/secure-form-handler-example.md +925 -925
  327. package/augment-extensions/workflows/wordpress-plugin/examples/security-audit-workflow.md +752 -752
  328. package/augment-extensions/workflows/wordpress-plugin/examples/wordpress-org-submission-workflow.md +773 -773
  329. package/augment-extensions/workflows/wordpress-plugin/module.json +49 -49
  330. package/augment-extensions/workflows/wordpress-plugin/rules/best-practices.md +942 -942
  331. package/augment-extensions/workflows/wordpress-plugin/rules/development-workflow.md +702 -702
  332. package/augment-extensions/workflows/wordpress-plugin/rules/submission-workflow.md +728 -728
  333. package/augment-extensions/workflows/wordpress-plugin/rules/testing-workflow.md +775 -775
  334. package/augment-extensions/writing-standards/screenplay/README.md +339 -300
  335. package/augment-extensions/writing-standards/screenplay/_templates/README.md +121 -121
  336. package/augment-extensions/writing-standards/screenplay/_templates/genre-template.md +153 -153
  337. package/augment-extensions/writing-standards/screenplay/_templates/style-template.md +243 -243
  338. package/augment-extensions/writing-standards/screenplay/_templates/theme-template.md +213 -213
  339. package/augment-extensions/writing-standards/screenplay/examples/aaa-hollywood-scene.fountain +164 -164
  340. package/augment-extensions/writing-standards/screenplay/examples/beat-sheet-example.yaml +95 -95
  341. package/augment-extensions/writing-standards/screenplay/examples/character-profile-example.yaml +116 -116
  342. package/augment-extensions/writing-standards/screenplay/examples/commercial-30sec.fountain +151 -151
  343. package/augment-extensions/writing-standards/screenplay/examples/independent-monologue.fountain +67 -67
  344. package/augment-extensions/writing-standards/screenplay/examples/news-segment.fountain +142 -142
  345. package/augment-extensions/writing-standards/screenplay/examples/plot-outline-example.yaml +184 -184
  346. package/augment-extensions/writing-standards/screenplay/examples/tv-episode-teaser.fountain +204 -204
  347. package/augment-extensions/writing-standards/screenplay/genres/README.md +181 -181
  348. package/augment-extensions/writing-standards/screenplay/genres/examples/.gitkeep +2 -2
  349. package/augment-extensions/writing-standards/screenplay/genres/module.json +70 -70
  350. package/augment-extensions/writing-standards/screenplay/genres/rules/.gitkeep +2 -2
  351. package/augment-extensions/writing-standards/screenplay/genres/rules/action.md +399 -399
  352. package/augment-extensions/writing-standards/screenplay/genres/rules/adventure.md +407 -407
  353. package/augment-extensions/writing-standards/screenplay/genres/rules/animation.md +293 -293
  354. package/augment-extensions/writing-standards/screenplay/genres/rules/biographical.md +293 -293
  355. package/augment-extensions/writing-standards/screenplay/genres/rules/comedy.md +401 -401
  356. package/augment-extensions/writing-standards/screenplay/genres/rules/documentary.md +293 -293
  357. package/augment-extensions/writing-standards/screenplay/genres/rules/drama.md +409 -409
  358. package/augment-extensions/writing-standards/screenplay/genres/rules/fantasy.md +293 -293
  359. package/augment-extensions/writing-standards/screenplay/genres/rules/historical.md +293 -293
  360. package/augment-extensions/writing-standards/screenplay/genres/rules/horror.md +268 -268
  361. package/augment-extensions/writing-standards/screenplay/genres/rules/musical.md +294 -294
  362. package/augment-extensions/writing-standards/screenplay/genres/rules/mystery.md +293 -293
  363. package/augment-extensions/writing-standards/screenplay/genres/rules/noir.md +294 -294
  364. package/augment-extensions/writing-standards/screenplay/genres/rules/romance.md +293 -293
  365. package/augment-extensions/writing-standards/screenplay/genres/rules/sci-fi.md +289 -289
  366. package/augment-extensions/writing-standards/screenplay/genres/rules/superhero.md +293 -293
  367. package/augment-extensions/writing-standards/screenplay/genres/rules/thriller.md +294 -294
  368. package/augment-extensions/writing-standards/screenplay/genres/rules/western.md +293 -293
  369. package/augment-extensions/writing-standards/screenplay/module.json +124 -124
  370. package/augment-extensions/writing-standards/screenplay/rules/aaa-hollywood-films.md +339 -339
  371. package/augment-extensions/writing-standards/screenplay/rules/ai-integration-testing.md +329 -329
  372. package/augment-extensions/writing-standards/screenplay/rules/character-development.md +169 -169
  373. package/augment-extensions/writing-standards/screenplay/rules/commercials.md +437 -437
  374. package/augment-extensions/writing-standards/screenplay/rules/dialogue-writing.md +263 -263
  375. package/augment-extensions/writing-standards/screenplay/rules/diversity-inclusion.md +261 -261
  376. package/augment-extensions/writing-standards/screenplay/rules/examples-guide.md +315 -315
  377. package/augment-extensions/writing-standards/screenplay/rules/file-organization.md +213 -0
  378. package/augment-extensions/writing-standards/screenplay/rules/formatting-validation.md +413 -413
  379. package/augment-extensions/writing-standards/screenplay/rules/fountain-format.md +372 -372
  380. package/augment-extensions/writing-standards/screenplay/rules/independent-films.md +374 -374
  381. package/augment-extensions/writing-standards/screenplay/rules/live-tv-productions.md +443 -443
  382. package/augment-extensions/writing-standards/screenplay/rules/narrative-structures.md +207 -207
  383. package/augment-extensions/writing-standards/screenplay/rules/news-broadcasts.md +444 -444
  384. package/augment-extensions/writing-standards/screenplay/rules/pacing-timing.md +331 -331
  385. package/augment-extensions/writing-standards/screenplay/rules/quality-review-checklist.md +334 -334
  386. package/augment-extensions/writing-standards/screenplay/rules/quick-reference.md +299 -299
  387. package/augment-extensions/writing-standards/screenplay/rules/screen-continuity.md +263 -263
  388. package/augment-extensions/writing-standards/screenplay/rules/streaming-content.md +412 -412
  389. package/augment-extensions/writing-standards/screenplay/rules/trope-management.md +370 -370
  390. package/augment-extensions/writing-standards/screenplay/rules/tv-series.md +374 -374
  391. package/augment-extensions/writing-standards/screenplay/rules/universal-formatting.md +339 -339
  392. package/augment-extensions/writing-standards/screenplay/rules/vscode-integration.md +277 -277
  393. package/augment-extensions/writing-standards/screenplay/rules/web-content.md +393 -393
  394. package/augment-extensions/writing-standards/screenplay/schemas/beat-sheet.json +332 -332
  395. package/augment-extensions/writing-standards/screenplay/schemas/character-profile.json +247 -247
  396. package/augment-extensions/writing-standards/screenplay/schemas/feature-selection.json +200 -200
  397. package/augment-extensions/writing-standards/screenplay/schemas/plot-outline.json +233 -233
  398. package/augment-extensions/writing-standards/screenplay/schemas/screenplay-config.json +245 -245
  399. package/augment-extensions/writing-standards/screenplay/schemas/trope-inventory.json +221 -221
  400. package/augment-extensions/writing-standards/screenplay/styles/README.md +159 -159
  401. package/augment-extensions/writing-standards/screenplay/styles/examples/.gitkeep +2 -2
  402. package/augment-extensions/writing-standards/screenplay/styles/examples/style-applications.md +1449 -1449
  403. package/augment-extensions/writing-standards/screenplay/styles/module.json +64 -64
  404. package/augment-extensions/writing-standards/screenplay/styles/rules/.gitkeep +2 -2
  405. package/augment-extensions/writing-standards/screenplay/styles/rules/dialogue-centric.md +520 -520
  406. package/augment-extensions/writing-standards/screenplay/styles/rules/ensemble.md +499 -499
  407. package/augment-extensions/writing-standards/screenplay/styles/rules/epic.md +497 -497
  408. package/augment-extensions/writing-standards/screenplay/styles/rules/experimental.md +492 -492
  409. package/augment-extensions/writing-standards/screenplay/styles/rules/flashback.md +509 -509
  410. package/augment-extensions/writing-standards/screenplay/styles/rules/linear.md +490 -490
  411. package/augment-extensions/writing-standards/screenplay/styles/rules/minimalist.md +499 -499
  412. package/augment-extensions/writing-standards/screenplay/styles/rules/non-linear.md +501 -501
  413. package/augment-extensions/writing-standards/screenplay/styles/rules/poetic.md +499 -499
  414. package/augment-extensions/writing-standards/screenplay/styles/rules/realistic.md +498 -498
  415. package/augment-extensions/writing-standards/screenplay/styles/rules/satirical.md +499 -499
  416. package/augment-extensions/writing-standards/screenplay/styles/rules/surreal.md +508 -508
  417. package/augment-extensions/writing-standards/screenplay/styles/rules/voice-over.md +500 -500
  418. package/augment-extensions/writing-standards/screenplay/themes/README.md +158 -158
  419. package/augment-extensions/writing-standards/screenplay/themes/examples/.gitkeep +2 -2
  420. package/augment-extensions/writing-standards/screenplay/themes/examples/common-mistakes-and-fixes.md +643 -643
  421. package/augment-extensions/writing-standards/screenplay/themes/examples/complete-scene-example.md +311 -311
  422. package/augment-extensions/writing-standards/screenplay/themes/examples/individual-theme-examples.md +562 -562
  423. package/augment-extensions/writing-standards/screenplay/themes/examples/multi-theme-weaving.md +538 -538
  424. package/augment-extensions/writing-standards/screenplay/themes/examples/theme-application-guide.md +432 -432
  425. package/augment-extensions/writing-standards/screenplay/themes/examples/theme-integration-across-acts.md +637 -637
  426. package/augment-extensions/writing-standards/screenplay/themes/module.json +66 -66
  427. package/augment-extensions/writing-standards/screenplay/themes/rules/.gitkeep +2 -2
  428. package/augment-extensions/writing-standards/screenplay/themes/rules/ambition.md +458 -458
  429. package/augment-extensions/writing-standards/screenplay/themes/rules/betrayal.md +490 -490
  430. package/augment-extensions/writing-standards/screenplay/themes/rules/environment.md +458 -458
  431. package/augment-extensions/writing-standards/screenplay/themes/rules/fate.md +459 -459
  432. package/augment-extensions/writing-standards/screenplay/themes/rules/friendship.md +491 -491
  433. package/augment-extensions/writing-standards/screenplay/themes/rules/growth.md +491 -491
  434. package/augment-extensions/writing-standards/screenplay/themes/rules/identity.md +490 -490
  435. package/augment-extensions/writing-standards/screenplay/themes/rules/isolation.md +464 -464
  436. package/augment-extensions/writing-standards/screenplay/themes/rules/justice.md +461 -461
  437. package/augment-extensions/writing-standards/screenplay/themes/rules/love.md +489 -489
  438. package/augment-extensions/writing-standards/screenplay/themes/rules/power.md +494 -494
  439. package/augment-extensions/writing-standards/screenplay/themes/rules/redemption.md +483 -483
  440. package/augment-extensions/writing-standards/screenplay/themes/rules/revenge.md +489 -489
  441. package/augment-extensions/writing-standards/screenplay/themes/rules/survival.md +496 -496
  442. package/augment-extensions/writing-standards/screenplay/themes/rules/technology.md +463 -463
  443. package/augment-extensions/writing-standards/screenplay/utils/__tests__/file-organization.test.ts +169 -0
  444. package/augment-extensions/writing-standards/screenplay/utils/file-organization.ts +165 -0
  445. package/cli/MODULES.md +302 -302
  446. package/cli/dist/cli.js +113 -22
  447. package/cli/dist/cli.js.map +1 -1
  448. package/cli/dist/commands/gui.d.ts.map +1 -1
  449. package/cli/dist/commands/gui.js +54 -6
  450. package/cli/dist/commands/gui.js.map +1 -1
  451. package/cli/dist/commands/init.d.ts.map +1 -1
  452. package/cli/dist/commands/init.js +76 -23
  453. package/cli/dist/commands/init.js.map +1 -1
  454. package/cli/dist/commands/self-remove.d.ts.map +1 -1
  455. package/cli/dist/commands/self-remove.js +48 -74
  456. package/cli/dist/commands/self-remove.js.map +1 -1
  457. package/cli/dist/commands/show.d.ts +15 -0
  458. package/cli/dist/commands/show.d.ts.map +1 -1
  459. package/cli/dist/commands/show.js +576 -23
  460. package/cli/dist/commands/show.js.map +1 -1
  461. package/cli/dist/commands/showCompleted.d.ts +21 -0
  462. package/cli/dist/commands/showCompleted.d.ts.map +1 -0
  463. package/cli/dist/commands/showCompleted.js +225 -0
  464. package/cli/dist/commands/showCompleted.js.map +1 -0
  465. package/cli/dist/commands/skill.js +88 -88
  466. package/cli/dist/commands/update.d.ts +2 -0
  467. package/cli/dist/commands/update.d.ts.map +1 -1
  468. package/cli/dist/commands/update.js +67 -1
  469. package/cli/dist/commands/update.js.map +1 -1
  470. package/cli/dist/utils/beadsCompletedChecker.d.ts +72 -0
  471. package/cli/dist/utils/beadsCompletedChecker.d.ts.map +1 -0
  472. package/cli/dist/utils/beadsCompletedChecker.js +198 -0
  473. package/cli/dist/utils/beadsCompletedChecker.js.map +1 -0
  474. package/cli/dist/utils/catalog-sync.js +13 -13
  475. package/cli/dist/utils/config-system.d.ts +111 -0
  476. package/cli/dist/utils/config-system.d.ts.map +1 -0
  477. package/cli/dist/utils/config-system.js +239 -0
  478. package/cli/dist/utils/config-system.js.map +1 -0
  479. package/cli/dist/utils/extractCommandHelp.d.ts +51 -0
  480. package/cli/dist/utils/extractCommandHelp.d.ts.map +1 -0
  481. package/cli/dist/utils/extractCommandHelp.js +250 -0
  482. package/cli/dist/utils/extractCommandHelp.js.map +1 -0
  483. package/cli/dist/utils/hook-system.d.ts +84 -0
  484. package/cli/dist/utils/hook-system.d.ts.map +1 -0
  485. package/cli/dist/utils/hook-system.js +151 -0
  486. package/cli/dist/utils/hook-system.js.map +1 -0
  487. package/cli/dist/utils/inspection-cache.d.ts +56 -0
  488. package/cli/dist/utils/inspection-cache.d.ts.map +1 -0
  489. package/cli/dist/utils/inspection-cache.js +166 -0
  490. package/cli/dist/utils/inspection-cache.js.map +1 -0
  491. package/cli/dist/utils/inspection-handlers.d.ts +75 -0
  492. package/cli/dist/utils/inspection-handlers.d.ts.map +1 -0
  493. package/cli/dist/utils/inspection-handlers.js +171 -0
  494. package/cli/dist/utils/inspection-handlers.js.map +1 -0
  495. package/cli/dist/utils/install-rules.js +55 -55
  496. package/cli/dist/utils/mcp-integration.js +44 -44
  497. package/cli/dist/utils/module-system.d.ts +1 -0
  498. package/cli/dist/utils/module-system.d.ts.map +1 -1
  499. package/cli/dist/utils/module-system.js +8 -3
  500. package/cli/dist/utils/module-system.js.map +1 -1
  501. package/cli/dist/utils/plugin-system.d.ts +133 -0
  502. package/cli/dist/utils/plugin-system.d.ts.map +1 -0
  503. package/cli/dist/utils/plugin-system.js +210 -0
  504. package/cli/dist/utils/plugin-system.js.map +1 -0
  505. package/cli/dist/utils/progress.d.ts +67 -0
  506. package/cli/dist/utils/progress.d.ts.map +1 -0
  507. package/cli/dist/utils/progress.js +146 -0
  508. package/cli/dist/utils/progress.js.map +1 -0
  509. package/cli/dist/utils/rule-install-hooks.js +8 -8
  510. package/cli/dist/utils/stream-reader.d.ts +34 -0
  511. package/cli/dist/utils/stream-reader.d.ts.map +1 -0
  512. package/cli/dist/utils/stream-reader.js +147 -0
  513. package/cli/dist/utils/stream-reader.js.map +1 -0
  514. package/cli/dist/utils/vscode-editor.d.ts +45 -0
  515. package/cli/dist/utils/vscode-editor.d.ts.map +1 -0
  516. package/cli/dist/utils/vscode-editor.js +171 -0
  517. package/cli/dist/utils/vscode-editor.js.map +1 -0
  518. package/cli/dist/utils/vscode-links.d.ts +49 -0
  519. package/cli/dist/utils/vscode-links.d.ts.map +1 -0
  520. package/cli/dist/utils/vscode-links.js +167 -0
  521. package/cli/dist/utils/vscode-links.js.map +1 -0
  522. package/modules.md +667 -630
  523. package/package.json +85 -85
@@ -1,907 +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
-
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
+