<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Jonathan kip</title>
    <description>The latest articles on Forem by Jonathan kip (@jonathan_kip).</description>
    <link>https://forem.com/jonathan_kip</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3818256%2Fb571412d-15c8-4cfa-97c0-0622f4169297.jpg</url>
      <title>Forem: Jonathan kip</title>
      <link>https://forem.com/jonathan_kip</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jonathan_kip"/>
    <language>en</language>
    <item>
      <title>Understanding Data Modeling in Power BI: Joins, Relationships, and Schemas</title>
      <dc:creator>Jonathan kip</dc:creator>
      <pubDate>Sun, 29 Mar 2026 11:59:55 +0000</pubDate>
      <link>https://forem.com/jonathan_kip/understanding-data-modeling-in-power-bi-joins-relationships-and-schemas-106c</link>
      <guid>https://forem.com/jonathan_kip/understanding-data-modeling-in-power-bi-joins-relationships-and-schemas-106c</guid>
      <description>&lt;p&gt;&lt;strong&gt;Power BI&lt;/strong&gt; is a platform that enables users to connect to various data sources, transform data, create interactive visualizations, and share insights through dashboards and reports.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data modeling&lt;/strong&gt;  refers to the process of defining how tables connect, interact, and filter each other to enable accurate calculations, fast performance, and intuitive reporting.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;SQL JOINS&lt;/strong&gt;     &lt;/u&gt;                                                   &lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;INNER JOIN&lt;/strong&gt;&lt;/em&gt;-Returns matching rows from both tables.&lt;br&gt;
&lt;em&gt;&lt;strong&gt;LEFT JOIN&lt;/strong&gt;&lt;/em&gt;-All rows from left table, matching from right, NULLs for no match. &lt;br&gt;
&lt;em&gt;&lt;strong&gt;RIGHT JOIN&lt;/strong&gt;&lt;/em&gt;-All rows from right table, matching from left, NULLs for no match.&lt;br&gt;
&lt;em&gt;&lt;strong&gt;FULL OUTER&lt;/strong&gt;&lt;/em&gt;-All rows from both, NULLs where no match.&lt;br&gt;
&lt;em&gt;&lt;strong&gt;LEFT ANTI&lt;/strong&gt;&lt;/em&gt;-Rows in left table with no match in right.&lt;br&gt;
&lt;em&gt;&lt;strong&gt;RIGHT ANTI&lt;/strong&gt;&lt;/em&gt;-Rows in right table with no match in left. &lt;/p&gt;

&lt;p&gt;&lt;u&gt;&lt;strong&gt;POWERBI RELATIONSHIP&lt;/strong&gt;&lt;/u&gt;&lt;br&gt;
Power BI relationships connect tables in the data model to enable dynamic filtering and accurate aggregations across visuals without physically merging data.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Relationship Cardinality&lt;/strong&gt;&lt;br&gt;
Cardinality defines how many rows in one table match rows in another.&lt;/p&gt;

&lt;p&gt;1:1 (One-to-One): Each row in Table A matches exactly one row in Table B (e.g., Employee to EmployeeDetails via unique EmployeeID); rare, used for normalized data or security filtering.&lt;/p&gt;

&lt;p&gt;1:M (One-to-Many): One row in Table A matches multiple in Table B (e.g., Product to Sales via ProductID); standard for star schemas.&lt;/p&gt;

&lt;p&gt;M:M (Many-to-Many): Multiple rows in both tables match (e.g., Students to Classes); avoid direct M:M—instead use a bridge table for performance and clarity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Active vs Inactive Relationships&lt;/strong&gt;&lt;br&gt;
Active: Default, single relationship per table pair; filter context propagates automatically in visuals and DAX (solid line).&lt;/p&gt;

&lt;p&gt;Inactive: Additional relationships (dashed line); ignored by default—activate via USERELATIONSHIP() DAX function for specific measures (e.g., role-playing dates).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cross-Filter Direction&lt;/strong&gt;&lt;br&gt;
Controls filter propagation:&lt;/p&gt;

&lt;p&gt;Single: Filters flow one way (default for 1:M, e.g., Dimension → Fact).&lt;/p&gt;

&lt;p&gt;Both: Bi-directional (e.g., Fact ↔ Dimension); use cautiously to avoid ambiguity or performance hits.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The difference between joins and relationships&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41vtf35tezifk3vadtql.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F41vtf35tezifk3vadtql.png" alt="The difference between joins and relationships" width="688" height="262"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fact vs Dimension Tables&lt;/strong&gt;&lt;br&gt;
Fact tables store quantitative metrics (e.g., SalesAmount, Quantity) with foreign keys to dimensions; they grow vertically with transactions.&lt;/p&gt;

&lt;p&gt;Dimension tables hold descriptive attributes (e.g., ProductName, CustomerCity) with hierarchies; they grow horizontally and less frequently.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Star Schema&lt;/em&gt;: Central fact table surrounded by denormalized dimension tables; simplest and fastest for Power BI queries.&lt;br&gt;
Use Case: Sales dashboards needing quick slicing by product/customer.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Snowflake Schema&lt;/em&gt;: Dimensions normalized into sub-tables (e.g., Product → Category); saves storage but slower joins.&lt;br&gt;
Use Case: Data warehouses with complex hierarchies; avoid in pure Power BI models.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Flat Table (DLAT)&lt;/em&gt;: Single denormalized table blending facts/dimensions; easy but inefficient for filtering.&lt;br&gt;
Use Case: Small, simple datasets before unpivoting into star schema.&lt;/p&gt;

&lt;p&gt;Role-Playing Dimensions&lt;br&gt;
A single dimension (e.g., Date table) connects to a fact table multiple times for different roles (OrderDate, ShipDate). Use inactive relationships + USERELATIONSHIP() DAX to activate contextually.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Common Modeling Issues&lt;/strong&gt;&lt;br&gt;
Circular dependencies: Resolved by star schema or inactive relationships.&lt;br&gt;
Bi-directional filter loops: Set single direction.&lt;br&gt;
Wrong cardinality: Causes incorrect aggregations; verify in properties.&lt;br&gt;
Ambiguous paths: Hide unused columns or use bridge tables.&lt;/p&gt;

</description>
      <category>analytics</category>
      <category>sql</category>
      <category>tutorial</category>
      <category>powebi</category>
    </item>
  </channel>
</rss>
