Course contentsShow
← Databases & SQL
Lesson 496 of 1,9535. Relational Schema ArchitectureFree lesson

Caching Strategies via Schema Design

Expose data access timestamps in tables to facilitate smarter cache invalidation strategies.

Caching Strategies via Schema Design

In this lesson, you will learn how to add specific metadata columns to your tables to enable smarter, more efficient cache invalidation.

When we cache database results (like in Redis or an application-layer cache), the hardest problem is knowing when the cache is stale. If your application blindly caches a row for ten minutes, your users might see outdated data. If you set the cache expiration too low, you defeat the purpose of caching by overloading your database with repetitive reads.

The solution lies in your schema. By exposing data access and modification timestamps directly in your relational tables, your application can make intelligent decisions about whether to fetch from the cache or the database.

Implementing updated_at and last_accessed_at

Adding a last_updated timestamp is standard, but adding a last_read or last_accessed timestamp allows you to track the "freshness" of your data against your cache policy.

Consider this table structure:

CREATE TABLE products (
    id SERIAL PRIMARY KEY,
    name VARCHAR(255),
    price DECIMAL,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    last_queried_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

How to use this for Cache Invalidation

  1. The Invalidation Trigger: Whenever an UPDATE operation occurs on a row, the database automatically updates the updated_at column. Your application cache can store the updated_at value alongside the object. Before serving the cached data, the app performs a lightweight check: "Has the updated_at value in the database changed since I last cached this?" If not, you serve the cache; if it has, you purge the stale entry.
  2. The "Cold Data" Strategy: By tracking last_queried_at, you can identify which rows are rarely accessed. If a row hasn’t been queried in 30 days, your background processes can safely remove that item from your high-memory cache without impacting performance, as the schema proves the data is "cold."

By baking these timestamps into your schema, you shift the burden of cache management from complex application logic to simple, reliable database constraints.

Key Takeaway: Adding updated_at and last_accessed_at columns to your tables provides the necessary metadata for the application layer to verify cache integrity and prune stale entries efficiently.