{"model_type":"Star Schema","description":"Magic: The Gathering Cardmarket Market Intelligence Data Model for Power BI","tables":{"DimCards":{"type":"Dimension","primary_key":"card_id","columns":["card_id","card_name","expansion","card_number","rarity","url","image_url","art_crop_url"]},"DimSellers":{"type":"Dimension","primary_key":"seller_name","columns":["seller_name","seller_country","seller_type","sales_volume_tier"]},"DimConditions":{"type":"Dimension","primary_key":"condition_code","columns":["condition_code","condition_name","condition_rank"]},"DimDate":{"type":"Dimension","primary_key":"date_key","columns":["date_key","date","year","quarter","month","month_name","day","day_of_week","is_weekend"]},"FactPriceSnapshots":{"type":"Fact","foreign_keys":{"card_id":"DimCards.card_id","date_key":"DimDate.date_key"},"columns":["snapshot_id","card_id","date_key","from_price_eur","price_trend_eur","avg_30d_eur","avg_7d_eur","avg_1d_eur","price_spread_eur","spread_percentage","available_items"]},"FactOffers":{"type":"Fact","foreign_keys":{"card_id":"DimCards.card_id","seller_name":"DimSellers.seller_name","condition_code":"DimConditions.condition_code","date_key":"DimDate.date_key"},"columns":["offer_pk","card_id","offer_id","seller_name","condition_code","language","is_foil","price_eur","quantity","total_lot_value_eur"]},"FactConditionHistory":{"type":"Fact","foreign_keys":{"card_id":"DimCards.card_id","condition_code":"DimConditions.condition_code","date_key":"DimDate.date_key"},"columns":["snapshot_id","card_id","date_key","condition_code","is_foil","from_price_eur","avg_price_eur","median_price_eur","offer_count","total_quantity","scraped_at"]},"FlatMarketAnalysis":{"type":"Denormalized Dataset","description":"Ready-to-use consolidated view for quick Power BI reports without table joins"}},"relationships":[{"from":"FactPriceSnapshots.card_id","to":"DimCards.card_id","cardinality":"ManyToOne"},{"from":"FactPriceSnapshots.date_key","to":"DimDate.date_key","cardinality":"ManyToOne"},{"from":"FactOffers.card_id","to":"DimCards.card_id","cardinality":"ManyToOne"},{"from":"FactOffers.seller_name","to":"DimSellers.seller_name","cardinality":"ManyToOne"},{"from":"FactOffers.condition_code","to":"DimConditions.condition_code","cardinality":"ManyToOne"},{"from":"FactOffers.date_key","to":"DimDate.date_key","cardinality":"ManyToOne"},{"from":"FactConditionHistory.card_id","to":"DimCards.card_id","cardinality":"ManyToOne"},{"from":"FactConditionHistory.condition_code","to":"DimConditions.condition_code","cardinality":"ManyToOne"},{"from":"FactConditionHistory.date_key","to":"DimDate.date_key","cardinality":"ManyToOne"}],"recommended_dax_measures":[{"name":"Lowest NM Price","dax":"Lowest NM Price = CALCULATE(MIN('FactConditionHistory'[from_price_eur]), 'FactConditionHistory'[condition_code] = \"NM\", 'FactConditionHistory'[is_foil] = 0)","format":"Currency (€)"},{"name":"Average NM Price","dax":"Average NM Price = CALCULATE(AVERAGE('FactConditionHistory'[avg_price_eur]), 'FactConditionHistory'[condition_code] = \"NM\", 'FactConditionHistory'[is_foil] = 0)","format":"Currency (€)"},{"name":"Lowest EX Price","dax":"Lowest EX Price = CALCULATE(MIN('FactConditionHistory'[from_price_eur]), 'FactConditionHistory'[condition_code] = \"EX\", 'FactConditionHistory'[is_foil] = 0)","format":"Currency (€)"},{"name":"Average Price Trend","dax":"Average Price Trend = AVERAGE('FactPriceSnapshots'[price_trend_eur])","format":"Currency (€)"},{"name":"Lowest Available Price","dax":"Lowest Available Price = MIN('FactPriceSnapshots'[from_price_eur])","format":"Currency (€)"},{"name":"Market Price Spread","dax":"Market Price Spread = [Average Price Trend] - [Lowest Available Price]","format":"Currency (€)"},{"name":"Total Available Inventory","dax":"Total Available Inventory = SUM('FactPriceSnapshots'[available_items])","format":"Whole Number"},{"name":"Active Offer Count","dax":"Active Offer Count = COUNTROWS('FactOffers')","format":"Whole Number"},{"name":"Average Offer Price","dax":"Average Offer Price = AVERAGE('FactOffers'[price_eur])","format":"Currency (€)"},{"name":"Foil Offer Share %","dax":"Foil Offer Share % = DIVIDE(CALCULATE(COUNTROWS('FactOffers'), 'FactOffers'[is_foil] = 1), COUNTROWS('FactOffers'), 0)","format":"Percentage"},{"name":"Professional Seller Share %","dax":"Professional Seller Share % = DIVIDE(CALCULATE(COUNTROWS('FactOffers'), 'DimSellers'[seller_type] = \"Professional\"), COUNTROWS('FactOffers'), 0)","format":"Percentage"}],"powerbi_image_setup_guide":{"title":"Displaying Card Images in Power BI","steps":["1. Load DimCards or FlatMarketAnalysis table into Power BI Desktop.","2. In the Data pane on the right, select the 'image_url' or 'art_crop_url' column.","3. In the ribbon at the top, switch to the 'Column Tools' tab.","4. Under 'Data category', change from 'Uncategorized' to 'Image URL'.","5. Drag 'image_url' into any Table visual, Card visual, or Tooltip to render live card scans."]}}