<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Data-Modeling on Brian Faust</title><link>https://vacua.dev/tags/data-modeling/</link><description>Recent content in Data-Modeling on Brian Faust</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Mon, 01 Jan 0001 00:00:00 +0000</lastBuildDate><atom:link href="https://vacua.dev/tags/data-modeling/rss.xml" rel="self" type="application/rss+xml"/><item><title>Validate at the Boundary You Control</title><link>https://vacua.dev/thoughts/validate-at-the-boundary-you-control/</link><pubDate>Thu, 01 Mar 2018 00:00:00 +0000</pubDate><guid>https://vacua.dev/thoughts/validate-at-the-boundary-you-control/</guid><description>&lt;p&gt;A booking request contains a recipient email and a phone number made entirely
of spaces.&lt;/p&gt;
&lt;p&gt;For one delivery service, email is enough. For the same service with a
particular handoff option, a phone number is mandatory. For another service,
phone is always mandatory.&lt;/p&gt;
&lt;p&gt;There is no honest global rule such as “phone is nullable” or “phone is
required.” The invariant depends on the operation the request asks the system
to perform.&lt;/p&gt;</description></item><item><title>Soft Deletes Preserve Ambiguity Too</title><link>https://vacua.dev/thoughts/soft-deletes-preserve-ambiguity-too/</link><pubDate>Tue, 01 Aug 2017 00:00:00 +0000</pubDate><guid>https://vacua.dev/thoughts/soft-deletes-preserve-ambiguity-too/</guid><description>&lt;p&gt;Adding &lt;code&gt;deleted_at&lt;/code&gt; to a table answers one question: when was this row marked as
deleted?&lt;/p&gt;
&lt;p&gt;It does not answer whether the row was safe to mark, who should still see it,
whether its credentials remain valid, whether it still occupies a unique
business slot, how it can be restored, or when its data should be erased.&lt;/p&gt;
&lt;p&gt;A retained cart cleanup could not safely reduce those questions to one nullable
timestamp. Old carts might still have a shipment, a payment session, a booking
attempt, or item work which had crossed a meaningful boundary. The eventual
policy archives a deliberately narrow set and preserves the aggregate as
evidence.&lt;/p&gt;</description></item><item><title>An Identifier Should Outlive Its Storage Engine</title><link>https://vacua.dev/thoughts/an-identifier-should-outlive-its-storage-engine/</link><pubDate>Sat, 01 Jul 2017 00:00:00 +0000</pubDate><guid>https://vacua.dev/thoughts/an-identifier-should-outlive-its-storage-engine/</guid><description>&lt;p&gt;A billing export once had enough information to reconstruct a missing account,
but not enough to name it.&lt;/p&gt;
&lt;p&gt;The account still existed in an older system. Its stable identifier reached the
export action. No matching row existed in the newer application&amp;rsquo;s user table,
so the action built a temporary object with safe fallback details. That object
had a synthetic local identifier, but its export identifier remained null.
Later, a queued data object required that identifier to be a string and
rejected the payload.&lt;/p&gt;</description></item></channel></rss>