<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Avinash Kumar on Medium]]></title>
        <description><![CDATA[Stories by Avinash Kumar on Medium]]></description>
        <link>https://medium.com/@avi18n?source=rss-3db390fe633e------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/0*MMs8HNhXVnVMsK-R</url>
            <title>Stories by Avinash Kumar on Medium</title>
            <link>https://medium.com/@avi18n?source=rss-3db390fe633e------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Tue, 10 Nov 2026 05:49:00 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@avi18n/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Governance-as-a-Referee (GaaR): What Soccer Taught Me About Real-Time Data Governance]]></title>
            <link>https://medium.com/@avi18n/governance-as-a-referee-gaar-what-soccer-taught-me-about-real-time-data-governance-8224d597b8fa?source=rss-3db390fe633e------2</link>
            <guid isPermaLink="false">https://medium.com/p/8224d597b8fa</guid>
            <dc:creator><![CDATA[Avinash Kumar]]></dc:creator>
            <pubDate>Thu, 23 Jul 2026 19:38:25 GMT</pubDate>
            <atom:updated>2026-07-23T19:38:25.991Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/600/1*MGsp-YT5BPDzLgyy1Lvbew.png" /><figcaption>Data Referee Agent</figcaption></figure><p><em>The FIFA World Cup may be over, but the soccer fever never really goes away.</em></p><p>Like millions of fans around the world, I still find myself watching highlights, debating referee decisions, and admiring how a single official can influence the outcome of an entire game. That fascination led me to an interesting thought: <strong>What if data governance worked like a soccer referee?</strong></p><p>The more I explored the idea, the more it started making sense.</p><p>Modern data platforms process massive volumes of data at incredible speed. Yet governance often happens after the fact. Data moves, transforms, gets consumed, and only later do we discover quality issues, policy violations, schema changes, or even sensitive data exposure.</p><p>In soccer, that approach would be absurd. Imagine allowing players to continue committing fouls throughout a match and reviewing them days later.</p><p>The referee’s role exists for one reason: <strong>watch the game in real time and make decisions before the game gets out of control.</strong></p><p>That simple thought gave birth to a Proof of Concept (PoC) that I call: Governance-as-a-Referee (GaaR)</p><p>Before anyone asks, this is not just a conceptual framework or a conference-slide idea.</p><p>I approached it as a <strong>working architectural proof of concept</strong>, exploring how AI agents, governance policies, event streams, and automated actions could work together to create a real-time governance referee operating directly inside data pipelines</p><h3>The Core Idea</h3><p>Soccer has a referee.</p><p>Data pipelines should have one too.</p><p>A referee does not play the game.</p><p>A referee observes, evaluates, and intervenes when necessary.</p><p>Similarly, a Data Referee should not transform data or perform business functions. Its only responsibility is to ensure the game is played according to the rules.</p><pre>Observe<br>   ↓<br>Evaluate<br>   ↓<br>Make Decision<br>   ↓<br>Take Action</pre><p>The referee continuously monitors data movement during a pipeline execution window.</p><p>I call this execution window <strong>T</strong>.</p><p>Just as a soccer match has 90 minutes, every pipeline has a finite runtime.</p><p>During T, the referee watches everything.</p><p>There is no “extra time” for governance.</p><p>Decisions must happen while the pipeline is running.</p><h3>Mapping Soccer to Data Governance</h3><p>The analogy became surprisingly powerful.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/625/1*suBwb3jgZfkTP93mcOsCow.png" /></figure><p>When viewed through this lens, many governance challenges become easier to explain and design.</p><h3>How the PoC Works</h3><p>The Proof of Concept introduces a dedicated governance agent that receives events from every stage of the pipeline.</p><pre>Pipeline Event<br>      ↓<br>Referee Agent<br>      ↓<br>Policy Evaluation<br>      ↓<br>Risk Assessment<br>      ↓<br>Decision<br>      ↓<br>Action</pre><p>The referee listens to:</p><ul><li>Data ingestion events</li><li>Schema modifications</li><li>Transformation activities</li><li>Data publication events</li><li>Security events</li><li>Metadata changes</li><li>Lineage changes</li></ul><p>Every event is checked against configurable policies.</p><h3>Yellow Cards</h3><p>Not every issue should stop the pipeline.</p><p>For example:</p><ul><li>Slight schema drift</li><li>Metadata missing</li><li>Freshness warning</li><li>Data quality degradation</li></ul><p>The referee issues a Yellow Card.</p><pre>Rule:<br>  Null Rate &gt; 5%<br><br>Action:<br>  Yellow Card</pre><p>Possible actions:</p><ul><li>Notify owner</li><li>Create governance ticket</li><li>Increase monitoring</li><li>Record incident</li></ul><p>Pipeline execution continues.</p><p>The goal is visibility, not disruption.</p><h3>Red Cards</h3><p>Some violations are too risky to ignore.</p><p>Examples:</p><ul><li>Sensitive data exposure</li><li>Policy violations</li><li>Unauthorized data movement</li><li>Regulatory non-compliance</li></ul><p>The referee issues a Red Card.</p><pre>Rule:<br>  PII detected in public zone<br><br>Action:<br>  Stop Pipeline</pre><h3>Introducing VAR for Data</h3><p>One of the most interesting parts of the PoC was introducing a concept inspired by Video Assistant Referee (VAR).</p><p>Sometimes a violation isn’t black and white.</p><p>A rules engine may detect an issue, but context matters.</p><p>For example:</p><pre>500 failed records detected</pre><p>Traditional systems may stop the job.</p><p>However, an AI-powered VAR agent might discover:</p><ul><li>Test environment</li><li>No downstream consumers</li><li>Historical tolerance exists</li></ul><p>Result:</p><pre>Yellow Card<br>instead of<br>Red Card</pre><p>This introduces contextual intelligence into governance decisions.</p><h3>Why This Model Excited Me</h3><p>Most governance solutions focus on detection.</p><p>This PoC focuses on <strong>decision-making during execution</strong>.</p><p>The distinction is important.</p><p>Traditional governance asks:</p><blockquote><em>What happened?</em></blockquote><p>GaaR asks:</p><blockquote><em>What should we do right now?</em></blockquote><p>That shift fundamentally changes governance from a passive function to an active operational capability.</p><h3>Benefits of Governance-as-a-Referee (GaaR)</h3><h3>1. Real-Time Enforcement</h3><p>Issues are addressed before they spread downstream.</p><p>The cost of remediation drops significantly.</p><h3>2. Reduced Governance Debt</h3><p>Organizations no longer accumulate hundreds of unresolved policy violations waiting for review.</p><h3>3. Faster Incident Response</h3><p>The system reacts immediately rather than waiting for batch audits.</p><h3>4. Better Trust in Data</h3><p>Consumers gain confidence that data has been continuously monitored throughout its lifecycle.</p><h3>6. AI-Assisted Decision Making</h3><p>Context-aware decisions reduce false positives and unnecessary pipeline shutdowns.</p><h3>7. Improved Auditability</h3><p>Every warning, decision, and intervention becomes part of an immutable match report.</p><h3>Challenges and Potential Drawbacks</h3><p>Like any new architectural pattern, GaaR is not without challenges.</p><h3>1. Risk of Over-Refereeing</h3><p>Too many rules can create unnecessary interruptions.</p><p>Nobody enjoys watching a soccer game where the referee stops play every minute.</p><p>The same applies to data platforms.</p><h3>2. Operational Complexity</h3><p>Introducing multiple governance agents increases architectural complexity.</p><p>Additional monitoring and orchestration capabilities are required.</p><h3>3. Performance Impact</h3><p>Continuous evaluation adds processing overhead.</p><p>Organizations must balance governance depth against latency requirements.</p><h3>4. False Positives</h3><p>A poorly designed rulebook can generate excessive warnings and red cards.</p><p>This can create alert fatigue.</p><h3>5. Agent Accountability</h3><p>When AI agents make governance decisions, organizations must ensure explainability and traceability.</p><p>Every decision should have a clear rationale.</p><h3>6. Initial Investment</h3><p>Building event-driven governance capabilities requires investment in:</p><ul><li>Metadata platforms</li><li>Event infrastructure</li><li>Policy engines</li><li>AI reasoning capabilities</li></ul><p>Not every organization is ready for that journey.</p><h3>Where GaaR Could Fit</h3><p>I believe Governance-as-a-Referee is particularly suited for:</p><ul><li>Data Mesh environments</li><li>Enterprise Data Platforms</li><li>Real-Time Analytics</li><li>AI and Machine Learning Pipelines</li><li>Financial Services</li><li>Healthcare Data Platforms</li><li>Highly Regulated Industries</li></ul><p>Essentially, any environment where delayed governance decisions introduce significant risk.</p><h3>Final Thoughts</h3><p>This PoC started with something unexpected: a soccer obsession that refused to fade after the tournament ended.</p><p>What began as a sports analogy evolved into a serious architectural experiment. The result was Governance-as-a-Referee (GaaR), a model that treats governance not as an after-the-fact audit function, but as an active participant in every data movement.</p><p>Will GaaR replace traditional governance frameworks? Probably not.</p><p>But I do believe it highlights an important shift that many organizations will eventually make: moving from <strong>governance by observation</strong> to <strong>governance by intervention</strong>.</p><p>Because in modern data ecosystems, the question is no longer:</p><blockquote>“Can we detect policy violations?”</blockquote><p>The more important question is:</p><blockquote>“Can we stop them before the final whistle?”</blockquote><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=8224d597b8fa" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Migrating JDE to Snowflake for Enterprise Asset Management ( EAM)]]></title>
            <link>https://medium.com/@avi18n/migrating-jde-to-snowflake-for-enterprise-asset-management-eam-03997a315280?source=rss-3db390fe633e------2</link>
            <guid isPermaLink="false">https://medium.com/p/03997a315280</guid>
            <dc:creator><![CDATA[Avinash Kumar]]></dc:creator>
            <pubDate>Sun, 19 Jul 2026 03:36:30 GMT</pubDate>
            <atom:updated>2026-07-19T03:36:30.786Z</atom:updated>
            <content:encoded><![CDATA[<p><em>How we decoded 5,000+ JDE (</em>JD Edwards EnterpriseOne)<em> tables, built a human-readable asset data warehouse in Snowflake, and laid the foundation for a modern EAM platform.</em></p><h3>The Problem</h3><p>If you’ve ever opened a JDE database and seen column names like ABAN8, ABALKY, RPAG, or GLDGJ, you know the feeling — it&#39;s like reading a foreign language without a dictionary.</p><p>JD Edwards EnterpriseOne is a powerful ERP system, but its database was designed in the 1990s when storage was expensive and column names were limited to 10 characters. The result? A naming convention that makes perfect sense to JDE veterans but is completely opaque to everyone else.</p><p>Now imagine you’re building a new Enterprise Asset Management (EAM) platform. You need to:</p><ul><li>Pull asset, equipment, and maintenance data from JDE</li><li>Make it understandable to data engineers, analysts, and business users</li><li>Structure it for modern analytics and operational dashboards</li><li>Keep it in sync as JDE continues to be the financial system of record</li></ul><p>This article walks through exactly how to do that using Snowflake as the target data warehouse.</p><h3>Architecture Overview</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*WbdeGrhTsR0jrrK68fwXAQ.png" /></figure><p>We follow the Medallion Architecture (Bronze → Silver → Gold):</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/922/1*6pQNb9ncQVuO2yOI4KdVBw.png" /></figure><h3>Step 1: Extract JDE Tables into Snowflake (Bronze Layer)</h3><p>First, get the raw data into Snowflake. You can use any ELT tool (Fivetran, Matillion, dbt, or a Python script).</p><h3>Python + Snowflake Connector</h3><pre># jde_to_snowflake_extract.py<br># Extracts JDE tables from Oracle → Snowflake RAW layer</pre><pre>import cx_Oracle<br>import snowflake.connector<br>import pandas as pd<br>from snowflake.connector.pandas_tools import write_pandas</pre><pre># Tables to extract for EAM<br>EAM_TABLES = {<br>    # Asset Master (System 03)<br>    &quot;F0301&quot;:  &quot;Asset Master&quot;,<br>    &quot;F03012&quot;: &quot;Asset Account Balances&quot;,<br>    # Fixed Assets (System 12)<br>    &quot;F1201&quot;:  &quot;Asset Master Tag File&quot;,<br>    &quot;F1202&quot;:  &quot;Asset Account Ledger&quot;,<br>    # Equipment &amp; Maintenance (System 13)<br>    &quot;F1301&quot;:  &quot;Equipment Master&quot;,<br>    &quot;F1303&quot;:  &quot;Equipment PM Schedule&quot;,<br>    &quot;F1310&quot;:  &quot;Work Order Completion&quot;,<br>    &quot;F1307&quot;:  &quot;Equipment Statistics&quot;,<br>    # Work Orders (System 48)<br>    &quot;F4801&quot;:  &quot;Work Order Master&quot;,<br>    # Lookup / Decoder<br>    &quot;F0005&quot;:  &quot;UDC Values (decoder ring)&quot;,<br>    &quot;F0101&quot;:  &quot;Address Book Master&quot;,<br>    &quot;F0006&quot;:  &quot;Business Unit Master&quot;,<br>}</pre><pre>def extract_and_load(table_name, description):<br>    # Connect to JDE Oracle<br>    dsn = cx_Oracle.makedsn(&quot;jde-host&quot;, 1521, service_name=&quot;JDEPROD&quot;)<br>    ora_conn = cx_Oracle.connect(&quot;jde_readonly&quot;, &quot;password&quot;, dsn)<br>    <br>    # Extract full table<br>    df = pd.read_sql(f&quot;SELECT * FROM PRODDTA.{table_name}&quot;, ora_conn)<br>    ora_conn.close()<br>    <br>    # Load into Snowflake<br>    sf_conn = snowflake.connector.connect(<br>        account=&quot;your_account&quot;,<br>        user=&quot;ETL_SERVICE&quot;,<br>        password=&quot;password&quot;,<br>        warehouse=&quot;ETL_WH&quot;,<br>        database=&quot;JDE_WAREHOUSE&quot;,<br>        schema=&quot;JDE_RAW&quot;<br>    )<br>    <br>    write_pandas(sf_conn, df, table_name,<br>                 auto_create_table=True, overwrite=True)<br>    <br>    print(f&quot; {table_name}: {len(df):,} rows loaded&quot;)<br>    sf_conn.close()</pre><pre># Extract all EAM tables<br>for table, desc in EAM_TABLES.items():<br>    extract_and_load(table, desc)</pre><p>Note : For production workloads, use Fivetran or Snowflake’s Oracle Connector for incremental loads. The Python approach works great for initial loads and smaller tables.</p><h3>Step 2: The JDE Decoder — Understanding Column Names</h3><p>Before we build readable views, we need to crack the naming convention. This is the Rosetta Stone of JDE:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/866/1*vRzRTLB8LUm7MMFkosZ_bA.png" /></figure><h3>The Master Decoder: JDE Data Dictionary (F9202)</h3><p>The best part? JDE has its own built-in dictionary. Table F9202 contains the description of every data item:</p><pre>-- Run this on your JDE Oracle database<br>-- F9202 = the Rosetta Stone of JDE<br>SELECT <br>    FRDTAI  AS data_item_alias,    -- e.g., &#39;AN8&#39;<br>    FRDTAS  AS data_item_title,    -- e.g., &#39;Address Number&#39;<br>    FRDSCA  AS description          -- Full description<br>FROM DD920.F9202<br>ORDER BY FRDTAI;</pre><p>Note : Export F9202 as CSV and load it into Snowflake as JDE_RAW.DATA_DICTIONARY. It becomes the foundation for automatic column renaming — we&#39;ll use it in Step 5.</p><h3>Step 3: Build the Silver Layer — Human-Readable Views</h3><p>This is where the magic happens. We create Snowflake views that rename every column, convert JDE dates, and decode UDC values.</p><h3>3.1 — JDE Julian Date Converter (UDF)</h3><p>JDE stores dates in Julian format: CYYDDD where C = century (0=1900s, 1=2000s), YY = year, DDD = day of year. So 125198 = 2025, day 198 = July 17, 2025.</p><pre>-- Convert JDE Julian Date to a real date<br>CREATE OR REPLACE FUNCTION JDE_CLEAN.JDE_DATE(julian_date NUMBER)<br>RETURNS DATE AS<br>$$<br>    CASE <br>        WHEN julian_date IS NULL OR julian_date = 0 THEN NULL<br>        ELSE DATEADD(<br>            &#39;DAY&#39;, <br>            MOD(julian_date, 1000) - 1,<br>            TO_DATE(<br>                (1900 + FLOOR(julian_date / 1000))::VARCHAR <br>                || &#39;-01-01&#39;, &#39;YYYY-MM-DD&#39;<br>            )<br>        )<br>    END<br>$$;</pre><pre>-- Test it:<br>-- SELECT JDE_CLEAN.JDE_DATE(125198);  → 2025-07-17 ✅<br>-- SELECT JDE_CLEAN.JDE_DATE(119001);  → 2019-01-01 ✅<br>-- SELECT JDE_CLEAN.JDE_DATE(0);       → NULL       ✅</pre><h3>3.2 — UDC Decoder View</h3><p>JDE stores coded values everywhere. F0005 is the universal decoder:</p><pre>-- Build a reusable UDC decoder view<br>CREATE OR REPLACE VIEW JDE_CLEAN.UDC_DECODER AS<br>SELECT<br>    TRIM(DRSY)    AS system_code,     -- e.g., &#39;12&#39;<br>    TRIM(DRRT)    AS record_type,     -- e.g., &#39;DS&#39;<br>    TRIM(DRKY)    AS code_value,      -- e.g., &#39;A&#39;<br>    TRIM(DRDL01)  AS description      -- e.g., &#39;Active&#39;<br>FROM JDE_RAW.F0005;</pre><pre>-- Common UDC lookups you&#39;ll need:<br>-- System &#39;00&#39;, Type &#39;DT&#39; → Document Types<br>-- System &#39;12&#39;, Type &#39;DS&#39; → Asset Status<br>-- System &#39;12&#39;, Type &#39;DM&#39; → Depreciation Methods<br>-- System &#39;13&#39;, Type &#39;ES&#39; → Equipment Status<br>-- System &#39;48&#39;, Type &#39;SS&#39; → Work Order Status</pre><h3>3.3 — Asset Master (Readable View)</h3><p>Now we combine everything — renamed columns, decoded dates, decoded UDCs:</p><pre>CREATE OR REPLACE VIEW JDE_CLEAN.ASSET_MASTER AS<br>SELECT<br>    -- Asset Identification<br>    a.FANUMB                               AS asset_number,<br>    TRIM(a.FADL01)                         AS asset_description,<br>    TRIM(a.FAASID)                         AS sub_asset_id,</pre><pre>    -- Classification (with decoded UDC)<br>    TRIM(a.FAARTP)                         AS asset_type_code,<br>    at_udc.description                     AS asset_type,<br>    TRIM(a.FAMCU)                          AS business_unit,<br>    TRIM(bu.MCDL01)                        AS business_unit_name,</pre><pre>    -- Location<br>    TRIM(a.FALOCN)                         AS asset_location,<br>    TRIM(a.FACTY1)                         AS city,<br>    TRIM(a.FAADDS)                         AS state,</pre><pre>    -- Financial (from F1201 Tag File)<br>    t.FCACST                               AS acquisition_cost,<br>    t.FCNBVL                               AS net_book_value,<br>    TRIM(t.FCDEPM)                         AS depreciation_method_code,<br>    dm_udc.description                     AS depreciation_method,<br>    t.FCDEPY                               AS useful_life_years,</pre><pre>    -- Dates (converted from Julian)<br>    JDE_CLEAN.JDE_DATE(t.FCDAJI)           AS acquisition_date,<br>    JDE_CLEAN.JDE_DATE(t.FCDPIN)           AS placed_in_service_date,<br>    JDE_CLEAN.JDE_DATE(t.FCDSDJ)           AS disposal_date,</pre><pre>    -- Status (decoded)<br>    TRIM(a.FAEQST)                         AS status_code,<br>    st_udc.description                     AS status,</pre><pre>    -- Audit<br>    TRIM(a.FAUSER)                         AS last_updated_by,<br>    JDE_CLEAN.JDE_DATE(a.FAUPMJ)           AS last_updated_date</pre><pre>FROM JDE_RAW.F0301 a<br>LEFT JOIN JDE_RAW.F1201 t<br>    ON a.FANUMB = t.FCNUMB AND a.FACO = t.FCCO<br>LEFT JOIN JDE_RAW.F0006 bu<br>    ON TRIM(a.FAMCU) = TRIM(bu.MCMCU)<br>LEFT JOIN JDE_CLEAN.UDC_DECODER at_udc<br>    ON at_udc.system_code = &#39;12&#39; <br>    AND at_udc.record_type = &#39;AT&#39;<br>    AND at_udc.code_value = TRIM(a.FAARTP)<br>LEFT JOIN JDE_CLEAN.UDC_DECODER dm_udc<br>    ON dm_udc.system_code = &#39;12&#39; <br>    AND dm_udc.record_type = &#39;DM&#39;<br>    AND dm_udc.code_value = TRIM(t.FCDEPM)<br>LEFT JOIN JDE_CLEAN.UDC_DECODER st_udc<br>    ON st_udc.system_code = &#39;12&#39; <br>    AND st_udc.record_type = &#39;DS&#39;<br>    AND st_udc.code_value = TRIM(a.FAEQST);</pre><h3>3.4 — Equipment Master</h3><pre>CREATE OR REPLACE VIEW JDE_CLEAN.EQUIPMENT_MASTER AS<br>SELECT<br>    e.EANUMB                               AS equipment_number,<br>    TRIM(e.EADL01)                         AS equipment_description,<br>    TRIM(e.EASERN)                         AS serial_number,</pre><pre>    -- Classification<br>    TRIM(e.EAEQTY)                         AS equipment_type_code,<br>    et_udc.description                     AS equipment_type,<br>    TRIM(e.EAEQST)                         AS status_code,<br>    es_udc.description                     AS equipment_status,<br>    TRIM(e.EACRIT)                         AS criticality,</pre><pre>    -- Location<br>    TRIM(e.EAMCU)                          AS business_unit,<br>    TRIM(e.EALOCN)                         AS location,</pre><pre>    -- Manufacturer<br>    TRIM(mfg.ABALPH)                       AS manufacturer_name,<br>    TRIM(e.EAAITM)                         AS model_number,</pre><pre>    -- Meter / Runtime<br>    e.EAMTRC                               AS current_meter_reading,<br>    TRIM(e.EAUOM)                          AS meter_unit,</pre><pre>    -- Hierarchy<br>    e.EAAPID                               AS parent_equipment,</pre><pre>    -- Dates<br>    JDE_CLEAN.JDE_DATE(e.EADPIN)           AS installed_date,<br>    JDE_CLEAN.JDE_DATE(e.EAWARJ)           AS warranty_expiry_date,</pre><pre>    -- Fleet (VMRS codes)<br>    TRIM(e.EAVINNU)                        AS vin_number</pre><pre>FROM JDE_RAW.F1301 e<br>LEFT JOIN JDE_RAW.F0101 mfg ON e.EAAN8 = mfg.ABAN8<br>LEFT JOIN JDE_CLEAN.UDC_DECODER et_udc<br>    ON et_udc.system_code = &#39;13&#39; <br>    AND et_udc.record_type = &#39;ET&#39;<br>    AND et_udc.code_value = TRIM(e.EAEQTY)<br>LEFT JOIN JDE_CLEAN.UDC_DECODER es_udc<br>    ON es_udc.system_code = &#39;13&#39; <br>    AND es_udc.record_type = &#39;ES&#39;<br>    AND es_udc.code_value = TRIM(e.EAEQST);</pre><h3>3.5 — Work Order History</h3><pre>CREATE OR REPLACE VIEW JDE_CLEAN.WORK_ORDER_HISTORY AS<br>SELECT<br>    w.WADOCO                               AS work_order_number,<br>    TRIM(w.WADL01)                         AS description,<br>    w.WANUMB                               AS equipment_number,<br>    TRIM(eq.EADL01)                        AS equipment_description,<br>    TRIM(w.WAMCU)                          AS business_unit,</pre><pre>    -- Status &amp; Priority<br>    TRIM(w.WASRST)                         AS status_code,<br>    ss_udc.description                     AS status,<br>    TRIM(w.WAPRTS)                         AS priority,</pre><pre>    -- Maintenance Type (decoded inline)<br>    CASE TRIM(w.WATYPS)<br>        WHEN &#39;PM&#39; THEN &#39;Preventive Maintenance&#39;<br>        WHEN &#39;CM&#39; THEN &#39;Corrective Maintenance&#39;<br>        WHEN &#39;EM&#39; THEN &#39;Emergency Maintenance&#39;<br>        WHEN &#39;PD&#39; THEN &#39;Predictive Maintenance&#39;<br>        ELSE TRIM(w.WATYPS)<br>    END                                    AS maintenance_type,</pre><pre>    -- Dates (all converted from Julian)<br>    JDE_CLEAN.JDE_DATE(w.WATRDJ)           AS order_date,<br>    JDE_CLEAN.JDE_DATE(w.WASTRT)           AS planned_start,<br>    JDE_CLEAN.JDE_DATE(w.WAADDJ)           AS actual_completion,</pre><pre>    -- Hours &amp; Cost<br>    w.WAHRSO                               AS estimated_hours,<br>    w.WAHRSA                               AS actual_hours,<br>    w.WAAMTE                               AS estimated_cost,<br>    w.WAAMTA                               AS actual_cost,</pre><pre>    -- Failure Codes (from completion)<br>    TRIM(c.ECFLCD)                         AS failure_code,<br>    TRIM(c.ECFLCS)                         AS failure_cause,<br>    TRIM(c.ECFLAC)                         AS corrective_action,</pre><pre>    -- Assigned Technician<br>    TRIM(tech.ABALPH)                      AS technician_name</pre><pre>FROM JDE_RAW.F4801 w<br>LEFT JOIN JDE_RAW.F1301 eq ON w.WANUMB = eq.EANUMB<br>LEFT JOIN JDE_RAW.F1310 c  ON w.WADOCO = c.ECDOCO<br>LEFT JOIN JDE_RAW.F0101 tech ON w.WAAN8 = tech.ABAN8<br>LEFT JOIN JDE_CLEAN.UDC_DECODER ss_udc<br>    ON ss_udc.system_code = &#39;48&#39;<br>    AND ss_udc.record_type = &#39;SS&#39;<br>    AND ss_udc.code_value = TRIM(w.WASRST);</pre><h3>Step 4: Build the Gold Layer — EAM Analytics</h3><p>The Gold layer combines Silver views into business-ready models. Here’s the crown jewel:</p><h3>Asset 360° View (with Health Score)</h3><pre>CREATE OR REPLACE VIEW EAM_ANALYTICS.ASSET_360 AS<br>WITH <br>maint_costs AS (<br>    SELECT <br>        equipment_number,<br>        COUNT(*)                           AS wo_count_12m,<br>        SUM(actual_cost)                   AS maint_cost_12m,<br>        SUM(CASE WHEN maintenance_type = &#39;Corrective Maintenance&#39;<br>                 THEN 1 ELSE 0 END)  AS corrective_count,<br>        SUM(CASE WHEN maintenance_type = &#39;Preventive Maintenance&#39;<br>                 THEN 1 ELSE 0 END)  AS preventive_count,<br>        MAX(actual_completion)             AS last_maintenance<br>    FROM JDE_CLEAN.WORK_ORDER_HISTORY<br>    WHERE order_date &gt;= DATEADD(&#39;month&#39;, -12, CURRENT_DATE())<br>    GROUP BY equipment_number<br>)<br>SELECT<br>    -- Identity<br>    a.asset_number,<br>    a.asset_description,<br>    e.serial_number,<br>    a.business_unit_name,<br>    a.asset_location,</pre><pre>    -- Financial<br>    a.acquisition_cost,<br>    a.net_book_value,<br>    a.acquisition_date,<br>    DATEDIFF(&#39;year&#39;, a.placed_in_service_date, CURRENT_DATE()) <br>                                           AS asset_age_years,<br>    -- Maintenance Summary<br>    COALESCE(mc.wo_count_12m, 0)           AS work_orders_12m,<br>    COALESCE(mc.maint_cost_12m, 0)         AS maintenance_cost_12m,<br>    mc.last_maintenance                    AS last_maintenance_date,</pre><pre>    -- Warranty<br>    e.warranty_expiry_date,<br>    CASE WHEN e.warranty_expiry_date &gt;= CURRENT_DATE()<br>         THEN &#39;Under Warranty&#39;<br>         ELSE &#39;Expired&#39;<br>    END                                    AS warranty_status,</pre><pre>    -- Health Score (0-100)<br>    GREATEST(0, LEAST(100,<br>        100<br>        - (COALESCE(mc.corrective_count, 0) * 5)<br>        - (CASE WHEN a.useful_life_years &gt; 0 <br>                AND DATEDIFF(&#39;year&#39;, a.placed_in_service_date, <br>                            CURRENT_DATE()) &gt; a.useful_life_years<br>                THEN 20 ELSE 0 END)<br>    ))                                     AS health_score,</pre><pre>    a.status                               AS asset_status</pre><pre>FROM JDE_CLEAN.ASSET_MASTER a<br>LEFT JOIN JDE_CLEAN.EQUIPMENT_MASTER e<br>    ON a.asset_number = e.equipment_number<br>LEFT JOIN maint_costs mc<br>    ON a.asset_number = mc.equipment_number;</pre><h3>Step 5: Auto-Generate Views from the Data Dictionary</h3><p>Instead of manually renaming 100+ columns per table, use JDE’s own Data Dictionary to auto-generate views:</p><pre># auto_generate_views.py<br># Reads F9202 (Data Dictionary) and auto-generates<br># Snowflake views with human-readable column names</pre><pre>import snowflake.connector<br>import re</pre><pre>def clean_name(jde_desc):<br>    &quot;&quot;&quot;Convert &#39;Address Number&#39; → &#39;ADDRESS_NUMBER&#39;&quot;&quot;&quot;<br>    name = re.sub(r&#39;[^A-Z0-9]+&#39;, &#39;_&#39;, jde_desc.strip().upper())<br>    return name.strip(&#39;_&#39;)[:255]</pre><pre>def generate_view(sf_conn, table_name):<br>    cur = sf_conn.cursor()<br>    <br>    # Get columns from the table<br>    cur.execute(f&quot;&quot;&quot;<br>        SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS<br>        WHERE TABLE_SCHEMA=&#39;JDE_RAW&#39; AND TABLE_NAME=&#39;{table_name}&#39;<br>        ORDER BY ORDINAL_POSITION<br>    &quot;&quot;&quot;)<br>    columns = [r[0] for r in cur.fetchall()]<br>    <br>    # Load data dictionary<br>    cur.execute(&quot;SELECT TRIM(FRDTAI), TRIM(FRDTAS) FROM JDE_RAW.F9202&quot;)<br>    data_dict = {r[0]: r[1] for r in cur.fetchall()}<br>    <br>    # Build renamed columns<br>    col_sql = []<br>    for col in columns:<br>        base = col[2:] if len(col) &gt; 2 else col<br>        if base in data_dict:<br>            col_sql.append(f&quot;    {col} AS {clean_name(data_dict[base])}&quot;)<br>        else:<br>            col_sql.append(f&quot;    {col}&quot;)<br>    <br>    view = f&quot;&quot;&quot;CREATE OR REPLACE VIEW JDE_CLEAN.{table_name}_V AS<br>SELECT<br>{chr(44).join(chr(10).join(col_sql))}<br>FROM JDE_RAW.{table_name};&quot;&quot;&quot;<br>    <br>    print(view)<br>    return view</pre><h3>Step 6: dbt Project Structure (Optional)</h3><p>For teams using dbt, here’s the recommended project layout:</p><pre>jde_eam_warehouse/<br>├── models/<br>│   ├── staging/              # Bronze → Silver<br>│   │   ├── stg_jde__asset_master.sql<br>│   │   ├── stg_jde__equipment_master.sql<br>│   │   ├── stg_jde__work_orders.sql<br>│   │   └── stg_jde__udc_decoder.sql<br>│   ├── intermediate/         # Silver transforms<br>│   │   ├── int_maintenance_costs.sql<br>│   │   └── int_equipment_hierarchy.sql<br>│   └── marts/                # Gold layer<br>│       ├── eam__asset_360.sql<br>│       └── eam__maintenance_kpis.sql<br>└── macros/<br>    └── jde_date.sql          # Reusable date converter</pre><p>dbt macro for JDE dates:</p><pre>-- macros/jde_date.sql<br>{% macro jde_date(column) %}<br>  CASE <br>    WHEN {{ column }} IS NULL OR {{ column }} = 0 THEN NULL<br>    ELSE DATEADD(&#39;DAY&#39;, MOD({{ column }}, 1000) - 1,<br>         TO_DATE((1900 + FLOOR({{ column }}/1000))::VARCHAR<br>                 || &#39;-01-01&#39;, &#39;YYYY-MM-DD&#39;))<br>  END<br>{% endmacro %}</pre><pre>-- Usage: SELECT {{ jde_date(&#39;FAUPMJ&#39;) }} AS updated_date</pre><h3>The Before &amp; After</h3><p>Let’s see the transformation in action:</p><h3>Before (JDE Raw)</h3><pre>FANUMB | FADL01          | FAEQST | FAUPMJ | FAMCU | FAAN8 | FCACST   | FCDEPY<br>-------|-----------------|--------|--------|-------|-------|----------|------<br>10542  | KOMATSU PC200-8 | A      | 125198 | 30    | 5847  | 285000.00| 10</pre><p><em>What does FAEQST = ‘A’ mean? What date is 125198? Who is 5847?</em></p><h3>After (Snowflake Clean)</h3><pre>asset_number | asset_description | status | last_updated | business_unit | responsible   | cost       | useful_life<br>-------------|-------------------|--------|--------------|---------------|---------------|------------|-----<br>10542        | KOMATSU PC200-8   | Active | 2025-07-17   | Houston Plant | John Martinez | $285,000   | 10 years</pre><p><em>Instantly understandable by anyone in the organization.</em></p><h3>Key Takeaways</h3><ol><li>Don’t fight JDE’s naming — translate it. Use the Medallion Architecture to keep raw data intact (Bronze) while building readable layers on top (Silver/Gold).</li><li>F9202 is your best friend. JDE’s own Data Dictionary can auto-rename 95% of columns. Extract it first.</li><li>F0005 is your decoder ring. Every coded value in JDE can be decoded through UDC lookups.</li><li>Julian dates are easy once you know the formula: CYYDDD → DATEADD(&#39;DAY&#39;, MOD(julian, 1000) - 1, ...)</li><li>Keep EAM and Financial data separate. Equipment and maintenance → EAM. Depreciation and GL → JDE. Integration views for shared data.</li><li>Health scores drive action. The Asset 360° view turns passive data into actionable maintenance insights.</li></ol><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=03997a315280" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[The Modern Data Architect]]></title>
            <link>https://medium.com/@avi18n/the-modern-data-architect-2ea1113c9819?source=rss-3db390fe633e------2</link>
            <guid isPermaLink="false">https://medium.com/p/2ea1113c9819</guid>
            <dc:creator><![CDATA[Avinash Kumar]]></dc:creator>
            <pubDate>Thu, 30 Apr 2026 17:51:02 GMT</pubDate>
            <atom:updated>2026-04-30T17:51:02.014Z</atom:updated>
            <content:encoded><![CDATA[<blockquote><em>What AI Does, What We Do Together, and What Only Humans Can Decide</em></blockquote><p>Artificial Intelligence is not replacing data architects — but it <strong>is</strong> reshaping the role in a fundamental way. The real shift isn’t about tools or automation. It’s about how we divide our work, how we think, and how we lead.</p><p>A simple model captures this evolution:</p><ul><li><strong>What AI can do alone</strong></li><li><strong>What we do with AI</strong></li><li><strong>What remains uniquely human</strong></li></ul><p>To make this meaningful, we need to layer in the traits that define great architects: the <strong>5Cs</strong> — <strong>Curiosity, Creativity, Communication, Courage, and Compassion</strong>. If <strong>C4</strong> (Context, Container, Component, Code) structures the architecture, the <strong>5Cs</strong> shape the architect.</p><p>AI accelerates everything in between.</p><h3>01 — What AI Can Do Alone</h3><h3>Driven by Curiosity</h3><p>AI thrives on repetition, patterns, and scale. In data architecture, this means automating much of the execution layer — especially tasks that are deterministic, pattern‑based, and context‑free.</p><p><strong>Where AI excels:</strong></p><ul><li>Generating ingestion pipelines (ETL/ELT)</li><li>Profiling data and detecting quality issues</li><li>Extracting metadata and building catalogs</li><li>Suggesting schemas and transformations</li><li>Monitoring pipelines and triggering alerts</li><li>Drafting documentation (dictionaries, lineage, mappings)</li></ul><p>These are tasks where the rules are clear and the boundaries are known.</p><h3>The Architect’s Role</h3><p>This is where <strong>Curiosity</strong> matters.</p><p>AI can tell you <em>what</em> exists in your data. Only a curious architect asks:</p><ul><li><em>Is this the right data?</em></li><li><em>What’s missing?</em></li><li><em>What questions should we be answering?</em></li><li><em>What assumptions are we making without realizing it?</em></li></ul><p>AI explores data. <strong>You decide what is worth exploring.</strong></p><h3>02 — What We Do With AI</h3><h3>Powered by Creativity and Communication</h3><p>This is the new center of gravity for the modern architect: <strong>augmented intelligence</strong>. AI becomes a collaborator — accelerating thinking, generating options, and reducing friction — but not replacing judgment.</p><p><strong>Where collaboration happens:</strong></p><ul><li>Designing modern architectures (lakehouse, warehouse, mesh)</li><li>Building and refining semantic and logical data models</li><li>Solving complex integration challenges across systems</li><li>Optimizing performance (partitioning, indexing, scaling)</li><li>Designing BI and analytics experiences</li><li>Creating and refining technical documentation</li></ul><p>AI generates possibilities. <strong>You turn them into solutions people can actually use.</strong></p><h3>The Architect’s Role</h3><p>This is where <strong>Creativity</strong> and <strong>Communication</strong> shine.</p><ul><li>Creativity is the ability to combine patterns in new ways — <em>like integrating claims, clinical, and customer data into a unified view.</em></li><li>Communication is the ability to make complexity understandable — <em>bridging business stakeholders, engineering teams, and analytics groups.</em></li></ul><p>AI accelerates execution. <strong>You provide meaning, clarity, and direction.</strong></p><h3>03 — What Remains Uniquely Human</h3><h3>Defined by Courage and Compassion</h3><p>Despite rapid advances, some aspects of data architecture cannot be automated. Not because AI is incapable, but because these decisions require <strong>context, accountability, and human judgment</strong>.</p><p><strong>Where humans lead:</strong></p><ul><li>Defining enterprise data strategy</li><li>Establishing business‑aligned data definitions (customer, claim, policy)</li><li>Driving governance, privacy, and compliance</li><li>Aligning stakeholders across business, IT, and analytics</li><li>Making trade‑offs (cost vs scalability vs performance)</li><li>Leading through ambiguity and incomplete information</li></ul><p>These decisions shape trust, risk, and long‑term value.</p><h3>The Architect’s Role</h3><p>This is where <strong>Courage</strong> and <strong>Compassion</strong> matter most.</p><ul><li><strong>Courage</strong> to make hard decisions — standardizing definitions, challenging poor data practices, choosing long‑term over short‑term.</li><li><strong>Compassion</strong> to understand the people behind the data — stakeholder needs, user frustrations, and the real‑world impact of data decisions.</li></ul><p>AI can recommend. <strong>You decide — and you are accountable for the outcome.</strong></p><h3>The Modern Data Architect’s Identity</h3><p>The role is no longer defined by:</p><ul><li>how much code you write</li><li>how many diagrams you produce</li><li>how many systems you integrate</li></ul><p>It is defined by:</p><ul><li><strong>how you think</strong></li><li><strong>how you decide</strong></li><li><strong>how you influence</strong></li><li><strong>how you balance competing priorities</strong></li></ul><p>AI changes the work. <strong>You change the organization.</strong></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2ea1113c9819" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[How Snowflake Openflow Redefines the CDP Landscape]]></title>
            <description><![CDATA[<div class="medium-feed-item"><p class="medium-feed-image"><a href="https://medium.com/@avi18n/how-snowflake-openflow-redefines-the-cdp-landscape-a086f0562696?source=rss-3db390fe633e------2"><img src="https://cdn-images-1.medium.com/max/1952/1*Bq6s_CnIzZ6aWMRnp2YoDw.png" width="1952"></a></p><p class="medium-feed-snippet">The introduction of Snowflake Openflow doesn&#x2019;t just tweak the CDP landscape &#x2014; it fundamentally reshapes it.</p><p class="medium-feed-link"><a href="https://medium.com/@avi18n/how-snowflake-openflow-redefines-the-cdp-landscape-a086f0562696?source=rss-3db390fe633e------2">Continue reading on Medium »</a></p></div>]]></description>
            <link>https://medium.com/@avi18n/how-snowflake-openflow-redefines-the-cdp-landscape-a086f0562696?source=rss-3db390fe633e------2</link>
            <guid isPermaLink="false">https://medium.com/p/a086f0562696</guid>
            <dc:creator><![CDATA[Avinash Kumar]]></dc:creator>
            <pubDate>Thu, 29 Jan 2026 10:31:21 GMT</pubDate>
            <atom:updated>2026-01-29T10:31:21.204Z</atom:updated>
        </item>
        <item>
            <title><![CDATA[Hybrid Data Modeling in Modern Analytics]]></title>
            <link>https://medium.com/@avi18n/hybrid-data-modeling-in-modern-analytics-413f8f7cba49?source=rss-3db390fe633e------2</link>
            <guid isPermaLink="false">https://medium.com/p/413f8f7cba49</guid>
            <dc:creator><![CDATA[Avinash Kumar]]></dc:creator>
            <pubDate>Fri, 17 Oct 2025 10:52:17 GMT</pubDate>
            <atom:updated>2025-10-17T10:52:17.827Z</atom:updated>
            <content:encoded><![CDATA[<blockquote>Why the Silver Layer Should Use Data Vault and the Gold Layer Should Use Star or Snowflake Models</blockquote><h3>Abstract</h3><p>As modern data platforms mature across cloud ecosystems — from Snowflake and Databricks to Azure Synapse and BigQuery — teams often face a false dichotomy:<br> <strong>Should we choose Data Vault or Dimensional Modeling?</strong></p><p>The most resilient architectures answer: <em>both.</em></p><p>By combining <strong>Data Vault 2.0</strong> in the <em>Silver (core integration)</em> layer and <strong>Star/Snowflake schemas</strong> in the <em>Gold (analytics)</em> layer, organizations achieve a balanced architecture — one that is <em>auditable, flexible, and high-performing</em>.</p><h3>The Challenge: Integrating Chaos, Serving Clarity</h3><p>Most enterprises ingest data from many systems:</p><ul><li>Batch ETL pipelines from operational sources</li><li>Event streams or APIs for near-real-time updates</li><li>Reference and master data from shared systems</li></ul><p>Each brings different keys, update cadences, and structures.</p><p>Traditional <strong>dimensional modeling</strong> (Star/Snowflake) works well for consumption but struggles with:</p><ul><li>Schema evolution</li><li>Late-arriving data</li><li>Multiple source systems</li></ul><p>Meanwhile, a raw data lake preserves everything but lacks traceability, versioning, and logical consistency.</p><p><strong>Data Vault 2.0</strong> bridges that gap — a methodology to capture <em>all history</em> and <em>all sources</em> without breaking downstream models.</p><h3>The Hybrid Architecture</h3><p>The hybrid data architecture brings structure and scalability by organizing data into distinct yet connected layers. Raw data from diverse systems first lands in the <strong>Bronze layer</strong>, where it is stored in its original form to preserve accuracy and traceability. From there, it moves into the <strong>Silver layer</strong>, which applies the <strong>Data Vault 2.0</strong> approach to integrate, historize, and govern the data through Hubs, Links, and Satellites. This layer provides the foundation for lineage, schema evolution, and auditability. Finally, the <strong>Gold layer</strong> transforms this curated and consistent information into <strong>Star or Snowflake schemas</strong> optimized for analytics and business intelligence, enabling clear, fast, and reliable insights. Together, these layers create a resilient pipeline — balancing flexibility in ingestion, control in integration, and simplicity in consumption.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YsEMzhzvwC_XtRaeUuKTyQ.png" /><figcaption>Hybrid Data Architecture</figcaption></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2WVFV4cOgTMFURCrefFD8g.png" /><figcaption>Data Flow</figcaption></figure><h3>Why Data Vault in Silver</h3><h4>- Advantages</h4><ol><li><strong>Traceability:</strong> Every record includes lineage, load timestamps, and source identifiers.</li><li><strong>Flexibility:</strong> Add new sources or attributes without schema refactoring.</li><li><strong>Full History:</strong> Satellites maintain historical versions of every change.</li><li><strong>Metadata Automation:</strong> Hub/Link/Satellite patterns lend themselves to code generation.</li><li><strong>Governance Alignment:</strong> Perfect for audit-driven or domain-driven data ownership.</li></ol><h4>- Considerations</h4><ol><li><strong>Complex Querying:</strong> Not easily consumable by analysts.</li><li><strong>Storage Overhead:</strong> More tables and joins than dimensional models.</li><li><strong>Performance:</strong> Multi-satellite joins require materialized PIT or bridge views for efficiency.</li></ol><p>Note :- Data Vault is excellent for <strong>integration</strong>, not direct analytics.</p><h3>Why Dimensional Models in Gold</h3><h4>- Advantages</h4><ol><li><strong>Ease of Use:</strong> Simple, business-friendly structures for reporting tools.</li><li><strong>Performance:</strong> Optimized for read patterns and aggregations.</li><li><strong>Semantic Clarity:</strong> Fact and dimension terminology aligns with business language.</li><li><strong>Compatibility:</strong> Natively supported by BI tools like Power BI, Tableau, Looker.</li></ol><h4>- Considerations</h4><ol><li><strong>Rigidity:</strong> Adding new dimensions or measures often requires redesign.</li><li><strong>Limited Lineage:</strong> Source-level tracking usually lost beyond the Silver layer.</li><li><strong>Duplication:</strong> Curated copies of already stored data.</li></ol><p>Thus, the Gold layer trades off lineage for speed and usability.</p><h3>How They Work Together</h3><h4>- Silver: Data Vault Integration</h4><ul><li>Ingest data via batch or streaming into staging.</li><li>Apply canonicalization and generate hash keys for business identifiers.</li><li>Load into <strong>Hubs (business keys)</strong>, <strong>Links (relationships)</strong>, and <strong>Satellites (descriptive attributes)</strong>.</li><li>Maintain historization with EFFECTIVE_FROM, EFFECTIVE_TO, IS_CURRENT.</li></ul><h4>- Gold: Dimensional Curation</h4><ul><li>Create <strong>Point-in-Time (PIT)</strong> and <strong>Bridge</strong> tables to flatten Vault data.</li><li>Derive <strong>Dimensions</strong> (e.g., Customer, Product, Program) and <strong>Fact</strong> tables (e.g., Transactions, Events).</li><li>Apply business rules, aggregations, and slowly changing dimensions (SCD Type-2).</li><li>Expose through BI tools or data APIs.</li></ul><p>This layered design allows analytics to move fast without compromising governance.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*YKX2GWafeSpcjeBftAY6xw.png" /></figure><h3>When to Use the Hybrid Model</h3><p><strong>Use Data Vault in Silver if</strong></p><ul><li>You integrate multiple systems with changing keys or structures.</li><li>Regulatory or audit traceability matters.</li><li>You anticipate schema evolution or late data.</li></ul><p><strong>Use Dimensional in Gold if</strong></p><ul><li>You need to serve high-performance dashboards and reports.</li><li>Business users need intuitive, KPI-ready data.</li><li>Aggregations and semantic modeling drive your reporting layer.</li></ul><h3><strong>Recommended Practices</strong></h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*2DiTvF8Kmx9YcPrAT1F97g.png" /></figure><h3>Conclusion</h3><p>A <strong>hybrid data modeling strategy</strong> allows organizations to scale agility and trust simultaneously.</p><ul><li><strong>Data Vault</strong> ensures <em>governed ingestion and historical integrity</em>.</li><li><strong>Dimensional models</strong> ensure <em>speed and usability for analytics</em>.</li></ul><p>By separating the <em>integration concern</em> (Silver) from the <em>consumption concern</em> (Gold), teams can continuously evolve their data estate — integrating new sources, supporting compliance, and enabling near-real-time insights without re-engineering the core.</p><p>In essence, it’s not <em>Data Vault vs Star Schema</em> — it’s <strong>Data Vault → Star Schema</strong>.<br> The smartest data platforms embrace both.</p><h3>Reference</h3><p><a href="https://www.databricks.com/blog/2022/06/24/data-warehousing-modeling-techniques-and-their-implementation-on-the-databricks-lakehouse-platform.html">Different Data Warehousing Modeling Techniques and How to Implement them on the Databricks Lakehouse Platform</a></p><p><a href="https://www.deloitte.com/nl/en/Industries/financial-services/perspectives/the-power-of-data-vault-modeling-enabling-an-agile-data-warehouse.html">https://www.deloitte.com/nl/en/Industries/financial-services/perspectives/the-power-of-data-vault-modeling-enabling-an-agile-data-warehouse.html</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=413f8f7cba49" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[PostgreSQL’s Unconditional Allure: A Battle for Dominance]]></title>
            <link>https://medium.com/@avi18n/postgresqls-unconditional-allure-a-battle-for-dominance-ff6bae0aae9d?source=rss-3db390fe633e------2</link>
            <guid isPermaLink="false">https://medium.com/p/ff6bae0aae9d</guid>
            <category><![CDATA[snowflake]]></category>
            <category><![CDATA[databricks]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[cloud-computing]]></category>
            <dc:creator><![CDATA[Avinash Kumar]]></dc:creator>
            <pubDate>Wed, 11 Jun 2025 19:10:06 GMT</pubDate>
            <atom:updated>2025-06-11T19:10:06.558Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*bhBSi9S3GFLeqGOAtvdTSw.png" /></figure><p>PostgreSQL started with a strong connection to its earlier version, akin to a youthful infatuation with Redshift, which also favored that specific iteration. Upon encountering Snowflake in a later phase, PostgreSQL found unconditional admiration. Finally, Databricks emerged, offering a modernized, serverless, and powerful PostgreSQL experience, leaving PostgreSQL lovers to consider which path to embrace.</p><p><strong>What is in News</strong>:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/320/0*mFJHlfiy9H-_NZnI" /></figure><p>Databricks officially unveiled Lakebase, a fully-managed Postgres database designed for data-driven applications and AI agents</p><p>Built natively on open-source PostgreSQL, including support for popular extensions like PostGIS and pgvector.</p><p>Offers modern architecture with separated compute &amp; storage, enabling &lt;10 ms latency and &gt;10,000 QPS for concurrent transactions</p><p>Seamlessly integrated into the Databricks Lakehouse, making it easy to blend operational workloads, analytics, and AI in a unified environment</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*ckCgllliZOMM8_aK.png" /></figure><p>Unified Platform: Now you can run OLTP/Postgres apps, analytical workloads, and AI models in one place using features like Unistore and Streams/Tasks .</p><p>Developer Ease: Full Postgres compatibility means no rewriting — use your existing ORMs (Prisma, SQLAlchemy), tools (psql, pg_dump), and extensions (pgvector, PostGIS) out-of-the-box.</p><p>Competitive Edge: Snowflake is directly competing with Databricks (which recently acquired Neon) by enhancing its AI/agent-building capabilities</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*uRs_vB3IxnXP2KQH-zYurA.png" /></figure><p>Databricks and Snowflake are both investing in PostgreSQL as the core OLTP layer for the evolving AI and analytics landscape, but they are catering to distinct audiences and future use cases.</p><p><strong>Databricks’ Focus:</strong></p><ul><li><strong>Target Audience:</strong> Modern application developers and AI builders.</li><li><strong>PostgreSQL Offering:</strong> Serverless, flexible, fast, and agent-compatible.</li><li><strong>Strategic Goal:</strong> To empower the creation of cutting-edge, AI-driven applications.</li><li><strong>Landscape</strong>: Shifting towards AI agents, microservices, and real-time applications, specifically to address the demands of Generative AI (GenAI)</li></ul><p><strong>Snowflake’s Focus:</strong></p><ul><li><strong>Target Audience:</strong> Traditional enterprise IT teams.</li><li><strong>PostgreSQL Offering:</strong> Secure, compliant, and scalable.</li><li><strong>Strategic Goal:</strong> To support core business applications requiring robust enterprise-grade solutions.</li><li><strong>Landscape </strong>: A complete, end-to-end solution that seamlessly supports both OLTP (transactional) and OLAP (analytical) workloads</li></ul><p>PostgreSQL is no longer just a database; it’s a strategic battleground for the future of data. Your organization’s adoption strategy for PostgreSQL must be deliberate, aligning with your overarching business objectives for either enterprise stability or rapid AI-driven innovation.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*7AYSYG1Z5dNove127acQ0w.png" /></figure><p><strong>Reference</strong>:</p><ul><li><a href="https://snowflake.com/en/blog/postgres-powering-enterprise-ai/">Snowflake Postgres: Built for Developers, Ready for the Enterprise</a></li><li><a href="https://www.databricks.com/blog/announcing-lakebase-public-preview?utm_source=chatgpt.com">Announcing Lakebase Public Preview</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ff6bae0aae9d" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>