All check_cardinality_?_?()
functions test the following conditions:
Is pk_column
is a unique key for parent_table
?
Is the set of values in fk_column
of child_table
a subset of the set of values of pk_column
?
Does the relation between the two tables of the data model meet the cardinality requirements?
examine_cardinality()
also checks the first two points and subsequently determines the type of cardinality.
check_cardinality_0_n(parent_table, pk_column, child_table, fk_column) check_cardinality_1_n(parent_table, pk_column, child_table, fk_column) check_cardinality_1_1(parent_table, pk_column, child_table, fk_column) check_cardinality_0_1(parent_table, pk_column, child_table, fk_column) examine_cardinality(parent_table, pk_column, child_table, fk_column)
parent_table | Data frame. |
---|---|
pk_column | Column of |
child_table | Data frame. |
fk_column | Column of |
For check_cardinality_?_?()
: Functions return parent_table
, invisibly, if the check is passed, to support pipes.
Otherwise an error is thrown and the reason for it is explained.
For examine_cardinality()
: Returns a character variable specifying the type of relationship between the two columns.
All cardinality-functions accept a parent table
(data frame), a column name of this table,
a child table
, and a column name of the child table.
The given column of the parent table
has to be one of its
unique keys (no duplicates are allowed).
Furthermore, in all cases, the set of values of the child table's column has to be a subset of the set of values of
the parent table's column.
The cardinality specifications 0_n
, 1_n
, 0_1
, 1_1
refer to the expected relation that the child table has with the parent table.
The numbers 0
, 1
and n
refer to the number of values in the column of the child table that correspond to each value of the
column of the parent table.
n
means "more than one" in this context, with no upper limit.
0_n
means, that each value of the pk_column
has at least 0
and at most
n
corresponding values in the column of the child table (which translates to no further restrictions).
1_n
means, that each value of the pk_column
has at least 1
and at most
n
corresponding values in the column of the child table.
This means that there is a "surjective" mapping from the child table
to the parent table w.r.t. the specified columns, i.e. for each parent table column value there exists at least one equal child table column value.
0_1
means, that each value of the pk_column
has at least 0
and at most
1
corresponding values in the column of the child table.
This means that there is a "injective" mapping from the child table
to the parent table w.r.t. the specified columns, i.e. no parent table column value is addressed multiple times.
But not all of the parent table
column values have to be referred to.
1_1
means, that each value of the pk_column
has exactly
1
corresponding value in the column of the child table.
This means that there is a "bijective" ("injective" AND "surjective") mapping
between the child table and the parent table w.r.t. the specified columns, i.e. the sets of values of the two columns are equal and
there are no duplicates in either of them.
Finally, examine_cardinality()
tests for and returns the nature of the relationship (injective, surjective, bijective, or none of these)
between the two given columns. If either pk_column
is not a unique key of parent_table
or the values of fk_column
are
not a subset of the values in pk_column
, the requirements for a cardinality test is not fulfilled. No error will be thrown, but
the result will contain the information which prerequisite was violated.
d1 <- tibble::tibble(a = 1:5) d2 <- tibble::tibble(c = c(1:5, 5)) d3 <- tibble::tibble(c = 1:4) # This does not pass, `c` is not unique key of d2: try(check_cardinality_0_n(d2, c, d1, a))#> Error : (`c`) not a unique key of `d2`.# This passes, multiple values in d2$c are allowed: check_cardinality_0_n(d1, a, d2, c) # This does not pass, injectivity is violated: try(check_cardinality_1_1(d1, a, d2, c))#> Error : 1..1 cardinality (bijectivity) is not given: Column `c` in table `d2` contains duplicate values.# This passes: check_cardinality_0_1(d1, a, d3, c) # Returns the kind of cardinality examine_cardinality(d1, a, d2, c)#> [1] "surjective mapping (child: 1 to n -> parent: 1)"