Foreign Keys and Relationships: Enforcing Relational Integrity
Learn how to use foreign keys to link tables and enforce relational integrity. Master the database constraints required to build a reliable SaaS data model.

Previously in this course, we covered the selection of Primary Keys and Identifiers: Designing for Data Integrity to ensure every record has a unique identity. Now, it is time to move from isolated tables to a cohesive system by implementing the physical connections between them.
In relational databases, we don't just rely on application logic to remember that an "Order" belongs to a "User." We use foreign keys—database constraints that turn our logical relationships into hard, enforceable rules.
What Are Foreign Keys and Relational Integrity?
A foreign key is a column (or group of columns) in one table that points to the primary key in another table. It acts as a cross-reference, creating a link between two entities.
When we define a foreign key, we are establishing relational integrity. This is a set of rules that ensures the data remains accurate and consistent across your entire database. Without these constraints, you risk "orphaned" records—data that refers to a parent that no longer exists.
Why Use Foreign Keys?
- Data Consistency: It prevents the database from accepting a record that references a non-existent parent.
- Cascading Actions: It allows the database to automatically handle updates or deletions (e.g., if you delete a user, you might want to delete their subscriptions automatically).
- Documentation: Your schema becomes self-documenting; anyone looking at your table definitions can immediately see the relationships.
Implementing Relationships in Your Schema

To implement a foreign key, the child table must include a column that matches the data type of the parent table's primary key.
In our ongoing SaaS project, we have an accounts table and a users table. Every user must belong to an account. Our logical design dictates a "one-to-many" relationship: one account can have many users.
Worked Example: Linking Users to Accounts
Let’s look at how we define this relationship in SQL. We assume the accounts table already exists with a primary key named id.
SQL-- The Parent Table CREATE TABLE accounts ( id UUID PRIMARY KEY, company_name VARCHAR(255) NOT NULL ); -- The Child Table CREATE TABLE users ( id UUID PRIMARY KEY, account_id UUID NOT NULL, email VARCHAR(255) UNIQUE, -- The Foreign Key Constraint CONSTRAINT fk_user_account FOREIGN KEY (account_id) REFERENCES accounts(id) );
In this example, the fk_user_account constraint ensures that every user record must contain an account_id that exists in the accounts table. If you attempt to insert a user with an account_id that isn't in the accounts table, the database will reject the transaction.
Hands-on Exercise
Imagine you are adding a subscriptions table to our SaaS project.
- Requirement: A subscription must be associated with exactly one
account. - Task: Draft a
CREATE TABLEstatement forsubscriptionsthat includes auser_id(pointing to theuserstable) and anaccount_id(pointing to theaccountstable). - Check: Ensure you are using the correct data types to match your primary keys.
Common Pitfalls
- Type Mismatch: The most common error is trying to link a
BIGINTforeign key to aUUIDprimary key. The data types must match exactly. - Performance Overhead: While foreign keys are vital for integrity, they do impose a small check on every
INSERTorUPDATE. In extremely high-throughput systems, some engineers debate this, but for 99% of SaaS applications, the safety provided by relational integrity far outweighs the negligible performance cost. - Circular Dependencies: Avoid creating loops where Table A references Table B, and Table B references Table A. This can make dropping tables or performing bulk imports very difficult.
Frequently Asked Questions
Q: Do I need a foreign key for every relationship? A: You should define a foreign key for every direct relationship where data integrity is required. If you choose not to, you are trusting your application code to manage consistency, which is prone to bugs.
Q: Can a foreign key be NULL? A: Yes. If the relationship is optional (e.g., a user might not have a manager), you can define the foreign key column as nullable.
Q: How do I handle deletions?
A: You can define ON DELETE CASCADE in your constraint. This tells the database to automatically delete child records when the parent is deleted, keeping your data clean.
Recap
By implementing foreign keys, you shift the responsibility of data consistency from your application code to the database engine itself. This ensures your SaaS project maintains high data quality as it grows, preventing orphaned records and enforcing the structure you defined during your Logical vs Physical Schema: Designing Databases for Implementation phase.
Up next: We will discuss how to apply column-level constraints to ensure the data within your rows remains clean and valid.
Work with me

Next.js Website & Landing Page Development
A blazing-fast, SEO-optimized website or landing page in Next.js — the kind that loads instantly and ranks. Design-to-code, done right.

Custom WordPress Theme Development
A custom WordPress theme built exactly to your design — fast, clean, and easy to manage. No bloated page builders, no compromises.