Page 287 - Mironsoft Blog
-
Maxim Mironjuk
-
April 06, 2025
Object-oriented inheritance does not map directly onto the relational model, which is why every mapping is a compromise. This article explains the three established patterns for inheritance in databases, Single Table Inheritance, Class Table Inheritance and Concrete Table Inheritance, with real table designs and their respective tradeoffs around NULL values, queries and extensibility.
-
Maxim Mironjuk
-
April 06, 2025
A well built print stylesheet decides whether a printout is readable or whether navigation, banner ads and cut off tables make the content unusable. With media print, targeted page breaks and visible link targets, a screen view becomes a document that also works on paper.
-
Maxim Mironjuk
-
April 06, 2025
When a heavily requested Redis key expires, hundreds of concurrent requests often hit the database unchecked, because each request handles the cache miss independently. This phenomenon is called cache stampede or thundering herd and can be prevented deliberately with mutex locking or probabilistic early expiration, without giving up the benefits of the cache.
-
Maxim Mironjuk
-
April 06, 2025
Alpine.js v3 ships with 15 directives, 6 magic properties, and 3 global methods. Anyone who knows all of them and understands where each one belongs can build interactive UIs without a build step, without a virtual DOM, and without the complexity of large frameworks: reactive, maintainable, and written directly in HTML.
-
Maxim Mironjuk
-
April 06, 2025
TypeScript's strict mode isn't a single switch, it's a bundle of eight compiler flags that together decide real type safety. Teams that enable strict only after years of loose code often face thousands of errors at once and abandon the migration. This article shows which flags deliver the most value for the least effort and how an existing codebase can realistically be converted step by step.
-
Maxim Mironjuk
-
April 06, 2025
Without the key modifier, Alpine confuses DOM elements with the wrong record in x-for lists as soon as entries are inserted, removed, or reordered. A stable, unique key solves this diffing problem and prevents focus jumps, wrong animations, and swapped form state.
-
Maxim Mironjuk
-
April 06, 2025
Self-signed certificates constantly trigger browser warnings and can't be used for APIs or service workers. Combining mkcert with a Docker reverse proxy solves the problem completely: local domains with real, trusted HTTPS, no cloud, no Let's Encrypt, no endless clicking.
-
Maxim Mironjuk
-
April 06, 2025
OFFSET-based pagination gets slower with every additional page, because the database still has to read and discard every skipped row. Keyset pagination, also called cursor pagination, replaces the page counter with a comparison against the last seen value and thereby delivers constant response times regardless of how deep you page into the result set.
-
Maxim Mironjuk
-
April 06, 2025
Every request payload an API accepts is, from TypeScript's point of view, unknown at first, no matter how trustworthy the client appears. This article shows how the trust boundary pattern consistently anchors validation at the system boundary, with middleware that validates before every handler, typed request objects throughout the rest of the code, and structured error propagation that prevents unchecked data from reaching deeper into the application.
-
Maxim Mironjuk
-
April 06, 2025
Frontend performance is visible down to the smallest detail in the DevTools, but the backend side usually stays a black box to the browser. The Server-Timing API closes that gap by carrying server-side measurements such as database time, cache status, or rendering duration straight into the browser's tools and the Navigation Timing API through a simple HTTP header.
-