There is no concrete difference between the two options. But in general they will be similar. I think you are talking about these options:
struct Person;
struct Skill;
struct PersonSkills {
person: PersonId,
skill: SkillId,
}
vs
struct Person {
skills: SkillId[],
}
struct Skill;
The main difference that I see is that there is a natural place to put data about this relationship with the "join table".
struct PersonSkills {
person: PersonId,
skill: SkillId,
acquired: Timestamp,
experience: Duration,
}
You can still do this at in the second one, but you notice that you are basically heading towards an interleaved join table.
struct PersonSkills {
skill: SkillId,
acquired: Timestamp,
experience: Duration,
}
struct Person {
skills: PersonSkills[],
}
There are other less abstract concerns. Such as performance (are you always loading the list of skills, what if it is long) or correctness (if you delete a Person do you want to delete these relationships, it comes "for free" if they are stored on the Person) But which is better will depend on your use case.