EXAMPLE 3: I recently struggled with a data model chosen for promotional offers. In this case, an offer, which is basically a discount on a set of articles, was uniquely identifiable not by one, but by four columns because it is attached to a communication channel, a set of discounted products and other data. This meant that every time we wanted to join any offer-related information, we had to join on four different columns. This was a huge burden on the database, not only because it meant that the database had to store and move four times the amount of data, but also because it made all the joins and execution plans much more complex. On top of that, we had to join this type of data A LOT, so we had to write the four lines long join condition in the SQL statements dozens, probably hundreds of times. Just typing all the join conditions again and again took a long time, not to mention the fact that the entire code base got unnecessarily bloated and the code got hard to read.