Skip to main content
For the sake of our illustration, we will consider the example of a simple B2C ecommerce app where users can purchase products. Users are served by merchants that store products. Each product is assigned a category. Merchants acquire these products from suppliers - called “vendors” - and store them till they are sold to a customer.

Business Context

App Workflow

  • Users log in and see items available at the nearest merchant.
  • Users add items to a virtual shopping cart.
  • Users check out the cart as a single order, which is delivered to their location.
  • Each order item has a landed cost price and an effective selling price
  • Effective selling price is calculated as the base selling price minus any discounts or promotions.

Key Metrics

These are the key metrics that the business is interested in:
  • GMV: Sum of the selling price of all orders.
  • Total Margin: Sum of the margin (selling price - landed cost price) of all orders.
  • Aggregations by date, merchant and product category.

Additional Complexity

  • Each merchant acquires items from vendors in batches, with varying prices.
  • The effective landed cost price is a weighted rolling average recalculated daily.
  • Promotions are applied at the item level.

Source Tables

Let’s define the schema of the source tables as they would appear in the production database:

Users

Contains information about the users of the app.

Merchants

Contains information about the merchants who store and sell items to users.

Items

Contains information about the items available for sale.

Promotions

Contains information about the promotions applied to items.

Inventory

Contains information about the batches of items acquired by merchants.

Orders

Contains information about the orders placed by users.

Order Items

Contains information about the items in each order.

Next Steps

In this section, we have defined the source tables that form the basis of our data model. You’ll notice that there are some irregularities in the way columns are named, or in terms of how information like locations are stored. This is quite common in real-world data sources. In the next section, we will create the staging layer where we can make sure all columns follow the correct data types and nomenclature.