Someone recently asked me why a one-to-many relationship exists in Contact Builder. And I think that's a very good question (also why there is a many-to-many relationship too). The ability to create these types or relationships has existed since Contact Builder was introduced, over five years ago.
The contact model (in Contact Builder) is pretty much exclusively used by Journey Builder (except for some internal platform purposes, like mapping relationships between the Contact Record to email Subscribers, mobile Contacts, etc).
If I have a one-to-many cardinal relationship to a 'Products' Attribute Set in Data Designer, and there is a single product record for the Contact, and I use that Attribute in a Journey Builder Decision Split Activity, then the Contact is routed through the correct branch:
However, if I update the Product DE (which is the linked Attribute Set in Data Designer) to include the following fields for a given Contact:
Id,Product
0031N00001IyHRiQAN,Banana
0031N00001IyHRiQAN,Apple
0031N00001IyHRiQAN,Carrot
Then when I inject the Contact back into the journey multiple times, they are routed through the first branch in the journey each time:
This behavior is understandable, as there is no concept of a one-to-many relationship in Journey Builder Activities.
However, this does beg the question: why can you create one-to-many relationships in the first place? There's no Marketing Cloud application that supports one-to-many (or even many-to-many) contact model relationships that I'm aware of.
Data Designer includes a library of impressive looking Attribute Groups for different use cases, like this one for 'Travel Bookings':
But I'm can't figure out how anyone is able to actually use this Attribute Group, or any one/many-to-many relationship in the contact model. Can you?
Update
Gortonington suggested in a comment that this might work if there are multiple conditions on a filter criteria. I've tested that, where my Product Attribute Set still contains the three records listed above (see earlier code block).
I created an additional branch in my journey for all products, where the filter criteria is:
Product equals
Banana
and Product equalsApple
and Product equalsCarrot
However, the Contact is still routed through the first branch, so that doesn't work.