Start here. This is the direct spoken answer to practice first.
Why this question matters
Foreign keys are basic on the surface, but the trade-offs become real when products delete accounts, tenants, files, and history.
Foreign keys enforce that related rows point to valid parent rows. They protect data integrity even if a bug or manual operation bypasses application code. Cascade delete can be convenient for tightly owned child rows, such as order draft items deleted with a draft. It becomes risky when the child data has audit, billing, history, or retention meaning. In those cases I would use restrict, soft delete, or an explicit cleanup workflow.