--- Join dependencies --- (taken from [Abiteboul \& Hull \& Vianu, 1995], using their Figure 8.2) Consider the relation R, with an instance given by Snack Distributor Price Theater ----------------------------------------- coffee Smart 2.35 Rex coffee Smart 2.35 Le Champo coffee Smart 2.35 Cinoche coffee Leclerc 2.60 Cinoche wine Smart 0.80 Rex wine Smart 0.80 Cinoche popcorn Leclerc 5.60 Cinoche We can assume the functional dependency Snack,Distributor -> Price but other non-trivial dependencies are hard to spot. In particular, a multi-valued dependency like Snack ->-> Theater does NOT hold. To see this, observe that R contains the tuples coffee Smart 2.35 Rex coffee Leclerc 2.60 Cinoche so the dependency proposed above would imply that R also has the tuples coffee Smart 2.35 Cinoche coffee Leclerc 2.60 Rex but only the first belongs to R. We might decompose R as follows: Snack,Distributor,Price Distributor,Theater Snack,Theater coffee Smart 2.35 Smart Rex coffee Rex coffee Leclerc 2.60 Smart LeChampo coffee LeChampo wine Smart 0.80 Smart Cinoche coffee Cinoche popcorn Leclerc 5.60 Leclerc Cinoche wine Rex wine Cinoche popcorn Cinoche It is easy to check that this decomposition is lossless for our specific instance. If that also holds in the general case, we say that there is a *join dependency* between the attribute sets {Snack,Distributor,Price} and {Distributor,Theater} and {Snack,Theater} A multi-valued dependency can be viewed as a special case of a join dependency, where there are only two attribute sets.