Skip to contents

Introduction

A single dimension can be referenced multiple times in a fact table, with each reference linked to a different conceptual role. These separate dimension views are called role dimensions and the common dimension is called a role-playing dimension.

Depending on the OLAP (On-Line Analytical Processing) query system that we use, we may be interested in having a single physical table and defining views on it (one view for each role) or a different physical table for each role. The rolap package tries to facilitate the operations to achieve the alternative that we decide to implement.

This document shows by means of an example the possibilities offered by the package in this context. First, through a star database, then by implementing a constellation. Finally, the conclusions are presented.

Role-playing and role dimensions in a star database

First of all, we are going to present the starting data, then we will define the star schema to obtain the star database. Next, we will see the different possibilities with the role-playing dimension and the roles.

Flat table with the initial data

We use a dataset based on the Deaths in 122 U.S. cities - 1962-2016. 122 Cities Mortality Reporting System dataset. Two additional dates have been generated, which were not present in the original dataset.

Reception Year Reception Week Reception Date Data Availability Year Data Availability Week Data Availability Date Year WEEK Week Ending Date REGION State City Pneumonia and Influenza Deaths All Deaths Other Deaths
1962 2 1962-01-11 1962 3 1962-01-15 1962 1 1962-01-06 1 CT Bridgeport 3 46 43
1962 3 1962-01-16 1962 3 1962-01-18 1962 2 1962-01-13 1 MA Boston 11 270 259
1962 2 1962-01-13 1962 2 1962-01-13 1962 2 1962-01-13 1 CT Hartford 2 54 52
1962 3 1962-01-15 1962 3 1962-01-17 1962 2 1962-01-13 1 CT Bridgeport 2 43 41
1962 4 1962-01-27 1962 6 1962-02-07 1962 4 1962-01-27 1 MA Boston 12 285 273
1962 2 1962-01-13 1962 3 1962-01-18 1962 2 1962-01-13 1 MA Cambridge 2 27 25
1962 11 1962-03-14 1962 11 1962-03-15 1962 9 1962-03-03 1 CT Hartford 3 63 60
1962 5 1962-01-29 1962 5 1962-02-01 1962 4 1962-01-27 1 CT Hartford 1 47 46
1962 4 1962-01-27 1962 4 1962-01-28 1962 4 1962-01-27 1 CT Bridgeport 4 46 42
1962 4 1962-01-27 1962 5 1962-02-01 1962 4 1962-01-27 1 MA Cambridge 1 40 39

We have selected a small dataset so that the result can be more easily appreciated. Several columns with time information have been added so that it is justified to define a time dimension that can play several roles.

Star schema

To define the schema, we get the table columns as shown below.

dput(colnames(ft_cause_rpd))
#> c("Reception Year", "Reception Week", "Reception Date", "Data Availability Year", 
#> "Data Availability Week", "Data Availability Date", "Year", "WEEK", 
#> "Week Ending Date", "REGION", "State", "City", "Pneumonia and Influenza Deaths", 
#> "All Deaths", "Other Deaths")

The definition of the star schema is shown below.

when <- dimension_schema(name = "When",
                         attributes = c("Year",
                                        "WEEK",
                                        "Week Ending Date"))
when_available <- dimension_schema(
  name = "When Available",
  attributes = c(
    "Data Availability Year",
    "Data Availability Week",
    "Data Availability Date"
  )
)
where <- dimension_schema(name = "where",
                          attributes = c("REGION",
                                         "State",
                                         "City"))
s <- star_schema() |>
  define_facts(fact_schema(
    name = "MRS Cause",
    measures = c("Pneumonia and Influenza Deaths",
                 "All Deaths")
  )) |>
  define_dimension(when) |>
  define_dimension(when_available) |>
  define_dimension(dimension_schema(
    name = "When Received",
    attributes = c("Reception Year",
                   "Reception Week",
                   "Reception Date")
  )) |>
  define_dimension(where)

As we will define more star schemas with dimensions in common, some of the dimensions have been defined as variables, to avoid repeating their definition later.

Star database

From the star schema and the flat table, we define the star database, as can be seen below.

db <- star_database(s, ft_cause_rpd) |>
  snake_case()

It has been transformed to snake case because it is usually more appropriate if we work in RDBMS (Relational Database Management Systems).

It can be seen that the tables associated with the dimension when (when, when_available, when_received) have the same structure, although the names of their attributes are different because they come from the same flat table and the field names cannot be repeated in the same table.

The instances of the tables of dimensions and facts of the star database are shown below.

when_key year week week_ending_date
1 1962 1 1962-01-06
2 1962 2 1962-01-13
3 1962 4 1962-01-27
4 1962 9 1962-03-03
when_available_key data_availability_year data_availability_week data_availability_date
1 1962 11 1962-03-15
2 1962 2 1962-01-13
3 1962 3 1962-01-15
4 1962 3 1962-01-17
5 1962 3 1962-01-18
6 1962 4 1962-01-28
7 1962 5 1962-02-01
8 1962 6 1962-02-07
when_received_key reception_year reception_week reception_date
1 1962 11 1962-03-14
2 1962 2 1962-01-11
3 1962 2 1962-01-13
4 1962 3 1962-01-15
5 1962 3 1962-01-16
6 1962 4 1962-01-27
7 1962 5 1962-01-29
where_key region state city
1 1 CT Bridgeport
2 1 CT Hartford
3 1 MA Boston
4 1 MA Cambridge
when_key when_available_key when_received_key where_key pneumonia_and_influenza_deaths all_deaths nrow_agg
1 3 2 1 3 46 1
2 2 3 2 2 54 1
2 4 4 1 2 43 1
2 5 3 4 2 27 1
2 5 5 3 11 270 1
3 6 6 1 4 46 1
3 7 6 4 1 40 1
3 7 7 2 1 47 1
3 8 6 3 12 285 1
4 1 1 2 3 63 1

We observe that each of the when dimensions (when, when_available, when_received) has its own set of instances, exclusively those necessary for the concept they represent.

Star database with a role-playing dimension and role dimensions

In the star database, we can define that any one of the dimensions is the role-playing dimension and the other dimensions are various roles of that dimension. The only requirement is that all dimensions must have the same number of attributes. This definition is shown below.

db_1 <- db |>
  role_playing_dimension(
    rpd = "when",
    roles = c("when_available", "when_received")
  )

The result can be seen in the instances of the star database tables, below.

when_key year week week_ending_date
1 1962 1 1962-01-06
2 1962 11 1962-03-14
3 1962 11 1962-03-15
4 1962 2 1962-01-11
5 1962 2 1962-01-13
6 1962 3 1962-01-15
7 1962 3 1962-01-16
8 1962 3 1962-01-17
9 1962 3 1962-01-18
10 1962 4 1962-01-27
11 1962 4 1962-01-28
12 1962 5 1962-01-29
13 1962 5 1962-02-01
14 1962 6 1962-02-07
15 1962 9 1962-03-03
when_available_key data_availability_year data_availability_week data_availability_date
1 1962 1 1962-01-06
2 1962 11 1962-03-14
3 1962 11 1962-03-15
4 1962 2 1962-01-11
5 1962 2 1962-01-13
6 1962 3 1962-01-15
7 1962 3 1962-01-16
8 1962 3 1962-01-17
9 1962 3 1962-01-18
10 1962 4 1962-01-27
11 1962 4 1962-01-28
12 1962 5 1962-01-29
13 1962 5 1962-02-01
14 1962 6 1962-02-07
15 1962 9 1962-03-03
when_received_key reception_year reception_week reception_date
1 1962 1 1962-01-06
2 1962 11 1962-03-14
3 1962 11 1962-03-15
4 1962 2 1962-01-11
5 1962 2 1962-01-13
6 1962 3 1962-01-15
7 1962 3 1962-01-16
8 1962 3 1962-01-17
9 1962 3 1962-01-18
10 1962 4 1962-01-27
11 1962 4 1962-01-28
12 1962 5 1962-01-29
13 1962 5 1962-02-01
14 1962 6 1962-02-07
15 1962 9 1962-03-03
where_key region state city
1 1 CT Bridgeport
2 1 CT Hartford
3 1 MA Boston
4 1 MA Cambridge
when_key when_available_key when_received_key where_key pneumonia_and_influenza_deaths all_deaths nrow_agg
1 6 4 1 3 46 1
5 5 5 2 2 54 1
5 8 6 1 2 43 1
5 9 5 4 2 27 1
5 9 7 3 11 270 1
10 11 10 1 4 46 1
10 13 10 4 1 40 1
10 13 12 2 1 47 1
10 14 10 3 12 285 1
15 3 2 2 3 63 1

We can see that the tables associated with the when dimension contain the same instances and the fact table has been updated appropriately.

In this example, the field names have been preserved, but surely we may want all tables to have the same field names, except for the surrogate key. This can be easily achieved by indicating that we want the names of the fields of the role-playing dimension or by indicating new names in the function. The first alternative is shown below, using the rpd_att_names parameter.

db_2 <- db |>
  role_playing_dimension(
    rpd = "when",
    roles = c("when_available", "when_received"),
    rpd_att_names = TRUE
  )

In this case, the schema is displayed as the result since the content of the tables is the same.

The physical tables are kept in the star database but we work with a RDBMS and we want to work with only one physical table for the dimension, the rest of the tables can be easily defined by views.

Role-playing and role dimensions in a constellation

With several star databases we can define a constellation where stars can share dimensions. Common dimensions must have the same name and structure. In the case of having role-playing dimensions and role dimensions, this must be taken into account since the shared dimensions must be transformed into conformed dimensions, but the package takes care of this automatically, as we will see below.

Second star database

We start with a similar dataset, with dates added to the original dataset, as shown below.

Arrival Year Arrival Week Arrival Date Data Availability Year Data Availability Week Data Availability Date Year WEEK Week Ending Date REGION State City Age Range Deaths
1962 5 1962-02-03 1962 6 1962-02-05 1962 5 1962-02-03 1 MA Cambridge 65+ years 23
1962 4 1962-01-27 1962 6 1962-02-07 1962 4 1962-01-27 1 MA Boston 25-44 years 8
1962 6 1962-02-11 1962 7 1962-02-17 1962 5 1962-02-03 1 CT Hartford <1 year 1
1962 5 1962-02-03 1962 6 1962-02-05 1962 5 1962-02-03 1 CT Bridgeport 45-64 years 15
1962 11 1962-03-14 1962 11 1962-03-15 1962 9 1962-03-03 1 CT Hartford 25-44 years 5
1962 9 1962-02-26 1962 9 1962-03-01 1962 8 1962-02-24 1 CT Hartford 25-44 years 1
1962 2 1962-01-13 1962 2 1962-01-13 1962 2 1962-01-13 1 CT Hartford 1-24 years 1
1962 6 1962-02-08 1962 7 1962-02-14 1962 5 1962-02-03 1 MA Boston 65+ years 142
1962 8 1962-02-25 1962 9 1962-03-01 1962 8 1962-02-24 1 MA Cambridge 45-64 years 8
1962 5 1962-01-29 1962 5 1962-02-01 1962 4 1962-01-27 1 CT Hartford 1-24 years 1
1962 4 1962-01-27 1962 4 1962-01-28 1962 4 1962-01-27 1 CT Bridgeport 65+ years 25
1962 8 1962-02-24 1962 9 1962-02-26 1962 8 1962-02-24 1 MA Boston 45-64 years 85
dput(colnames(ft_age_rpd))
#> c("Arrival Year", "Arrival Week", "Arrival Date", "Data Availability Year", 
#> "Data Availability Week", "Data Availability Date", "Year", "WEEK", 
#> "Week Ending Date", "REGION", "State", "City", "Age Range", "Deaths"
#> )

The definition of the star schema is shown below.

s_2 <- star_schema() |>
  define_facts(fact_schema(
    name = "MRS Age",
    measures = c(
      "Deaths"
    )
  )) |>
  define_dimension(when) |>
  define_dimension(when_available) |>
  define_dimension(dimension_schema(
    name = "When Arrived",
    attributes = c(
      "Arrival Year",
      "Arrival Week",
      "Arrival Date"
    )
  )) |>
  define_dimension(dimension_schema(
    name = "Who",
    attributes = c(
      "Age Range"
    )
  )) |>
  define_dimension(where)

We have reused the definitions of the When and When Available dimensions from the previous schema. A new dimension When Arrived has been added with different names in order to show how the definition works.

The definition of the star database is shown below.

db_3 <- star_database(s_2, ft_age_rpd) |>
  role_playing_dimension(
    rpd = "When Arrived",
    roles = c("When Available"),
    att_names = c("Year", "Week", "Week Ending Date")
  ) |>
  snake_case()

In this case, a role-playing dimension and a role dimension have been defined. The When dimension has not been included in this definition also to show how the system works.

The tables of the new star database are shown below.

when_key year week week_ending_date
1 1962 2 1962-01-13
2 1962 4 1962-01-27
3 1962 5 1962-02-03
4 1962 8 1962-02-24
5 1962 9 1962-03-03
when_available_key year week week_ending_date
1 1962 11 1962-03-14
2 1962 11 1962-03-15
3 1962 2 1962-01-13
4 1962 4 1962-01-27
5 1962 4 1962-01-28
6 1962 5 1962-01-29
7 1962 5 1962-02-01
8 1962 5 1962-02-03
9 1962 6 1962-02-05
10 1962 6 1962-02-07
11 1962 6 1962-02-08
12 1962 6 1962-02-11
13 1962 7 1962-02-14
14 1962 7 1962-02-17
15 1962 8 1962-02-24
16 1962 8 1962-02-25
17 1962 9 1962-02-26
18 1962 9 1962-03-01
when_arrived_key year week week_ending_date
1 1962 11 1962-03-14
2 1962 11 1962-03-15
3 1962 2 1962-01-13
4 1962 4 1962-01-27
5 1962 4 1962-01-28
6 1962 5 1962-01-29
7 1962 5 1962-02-01
8 1962 5 1962-02-03
9 1962 6 1962-02-05
10 1962 6 1962-02-07
11 1962 6 1962-02-08
12 1962 6 1962-02-11
13 1962 7 1962-02-14
14 1962 7 1962-02-17
15 1962 8 1962-02-24
16 1962 8 1962-02-25
17 1962 9 1962-02-26
18 1962 9 1962-03-01
who_key age_range
1 1-24 years
2 25-44 years
3 45-64 years
4 65+ years
5 <1 year
where_key region state city
1 1 CT Bridgeport
2 1 CT Hartford
3 1 MA Boston
4 1 MA Cambridge
when_key when_available_key when_arrived_key who_key where_key deaths nrow_agg
1 3 3 1 2 1 1
2 5 4 4 1 25 1
2 7 6 1 2 1 1
2 10 4 2 3 8 1
3 9 8 3 1 15 1
3 9 8 4 4 23 1
3 13 11 4 3 142 1
3 14 12 5 2 1 1
4 17 15 3 3 85 1
4 18 16 3 4 8 1
4 18 17 2 2 1 1
5 2 1 2 2 5 1

It can be seen that the When dimension is independent, it does not have the same instances as the other dimensions.

Constellation

The definition of the constellation is shown below.

ct <- constellation("MRS", db_2, db_3)

Below we can see the graphic representation of the tables that compose it.

The situation is that the When dimension in this second star database is independent of the other dimensions, but it is a common dimension with the first star database: it has to be a conformed dimension.

Below are the instances of the tables to better appreciate the result.

when_key year week week_ending_date
1 1962 1 1962-01-06
2 1962 11 1962-03-14
3 1962 11 1962-03-15
4 1962 2 1962-01-11
5 1962 2 1962-01-13
6 1962 3 1962-01-15
7 1962 3 1962-01-16
8 1962 3 1962-01-17
9 1962 3 1962-01-18
10 1962 4 1962-01-27
11 1962 4 1962-01-28
12 1962 5 1962-01-29
13 1962 5 1962-02-01
14 1962 5 1962-02-03
15 1962 6 1962-02-05
16 1962 6 1962-02-07
17 1962 6 1962-02-08
18 1962 6 1962-02-11
19 1962 7 1962-02-14
20 1962 7 1962-02-17
21 1962 8 1962-02-24
22 1962 8 1962-02-25
23 1962 9 1962-02-26
24 1962 9 1962-03-01
25 1962 9 1962-03-03
when_arrived_key year week week_ending_date
1 1962 1 1962-01-06
2 1962 11 1962-03-14
3 1962 11 1962-03-15
4 1962 2 1962-01-11
5 1962 2 1962-01-13
6 1962 3 1962-01-15
7 1962 3 1962-01-16
8 1962 3 1962-01-17
9 1962 3 1962-01-18
10 1962 4 1962-01-27
11 1962 4 1962-01-28
12 1962 5 1962-01-29
13 1962 5 1962-02-01
14 1962 5 1962-02-03
15 1962 6 1962-02-05
16 1962 6 1962-02-07
17 1962 6 1962-02-08
18 1962 6 1962-02-11
19 1962 7 1962-02-14
20 1962 7 1962-02-17
21 1962 8 1962-02-24
22 1962 8 1962-02-25
23 1962 9 1962-02-26
24 1962 9 1962-03-01
25 1962 9 1962-03-03
when_available_key year week week_ending_date
1 1962 1 1962-01-06
2 1962 11 1962-03-14
3 1962 11 1962-03-15
4 1962 2 1962-01-11
5 1962 2 1962-01-13
6 1962 3 1962-01-15
7 1962 3 1962-01-16
8 1962 3 1962-01-17
9 1962 3 1962-01-18
10 1962 4 1962-01-27
11 1962 4 1962-01-28
12 1962 5 1962-01-29
13 1962 5 1962-02-01
14 1962 5 1962-02-03
15 1962 6 1962-02-05
16 1962 6 1962-02-07
17 1962 6 1962-02-08
18 1962 6 1962-02-11
19 1962 7 1962-02-14
20 1962 7 1962-02-17
21 1962 8 1962-02-24
22 1962 8 1962-02-25
23 1962 9 1962-02-26
24 1962 9 1962-03-01
25 1962 9 1962-03-03
when_received_key year week week_ending_date
1 1962 1 1962-01-06
2 1962 11 1962-03-14
3 1962 11 1962-03-15
4 1962 2 1962-01-11
5 1962 2 1962-01-13
6 1962 3 1962-01-15
7 1962 3 1962-01-16
8 1962 3 1962-01-17
9 1962 3 1962-01-18
10 1962 4 1962-01-27
11 1962 4 1962-01-28
12 1962 5 1962-01-29
13 1962 5 1962-02-01
14 1962 5 1962-02-03
15 1962 6 1962-02-05
16 1962 6 1962-02-07
17 1962 6 1962-02-08
18 1962 6 1962-02-11
19 1962 7 1962-02-14
20 1962 7 1962-02-17
21 1962 8 1962-02-24
22 1962 8 1962-02-25
23 1962 9 1962-02-26
24 1962 9 1962-03-01
25 1962 9 1962-03-03
where_key region state city
1 1 CT Bridgeport
2 1 CT Hartford
3 1 MA Boston
4 1 MA Cambridge
who_key age_range
1 1-24 years
2 25-44 years
3 45-64 years
4 65+ years
5 <1 year
when_key when_available_key when_received_key where_key pneumonia_and_influenza_deaths all_deaths nrow_agg
1 6 4 1 3 46 1
5 5 5 2 2 54 1
5 8 6 1 2 43 1
5 9 5 4 2 27 1
5 9 7 3 11 270 1
10 11 10 1 4 46 1
10 13 10 4 1 40 1
10 13 12 2 1 47 1
10 16 10 3 12 285 1
25 3 2 2 3 63 1
when_key when_available_key when_arrived_key who_key where_key deaths nrow_agg
5 5 5 1 2 1 1
10 11 10 4 1 25 1
10 13 12 1 2 1 1
10 16 10 2 3 8 1
14 15 14 3 1 15 1
14 15 14 4 4 23 1
14 19 17 4 3 142 1
14 20 18 5 2 1 1
21 23 21 3 3 85 1
21 24 22 3 4 8 1
21 24 23 2 2 1 1
25 3 2 2 2 5 1

We can see that all the tables with information related to When dimension have the same instances, including all the instances of both star databases. In this example, the dimension attributes have been renamed.

The definition of the role-playing dimension and the role dimensions have been updated when integrating the two star databases. It can be queried using the following function.

ct  |>
  get_role_playing_dimension_names()
#> $rpd_1
#> [1] "when"           "when_arrived"   "when_available" "when_received"

The role-playing and role dimensions that share instances are displayed.

Conclusions

The rolap package supports the definition of role-playing and role dimensions in star databases. In this way, the result can be exported to a RDBMS where we can define the dimensions as independent tables or as views of a single physical table, as we need or prefer.

The definition of role-playing and role dimensions is propagated from star databases to constellations, allowing to integrate various definitions into a common one.