Разница между "Один ко многим", "многие к одному" и "многие ко многим"?


хорошо, так что это, вероятно, тривиальный вопрос, но у меня возникли проблемы с визуализацией и пониманием различий и когда их использовать. Я также немного не понимаю, как такие понятия, как однонаправленные и двунаправленные отображения, влияют на отношения "один ко многим" / "многие ко многим". Я использую Hibernate прямо сейчас, поэтому любое объяснение, связанное с ORM, будет полезно.

в качестве примера предположим, что у меня есть следующая настройка:

public class Person{
    private Long personId;
    private Set<Skill> skills;
    //Getters and setters
}

public class Skill{
    private Long skillId;
    private String skillName;
    //Getters and setters
}

Так в этом случае какая из картографирования я бы сделал? Ответы на этот конкретный пример определенно приветствуются, но мне также очень хотелось бы получить обзор того, когда использовать либо один-ко-многим, и многие-ко-многим, и когда использовать таблицу соединения против столбца соединения и однонаправленный против двунаправленного.

6 96

6 ответов:

один-ко-многим: один человек имеет много навыков, навык не используется повторно между людьми

  • однонаправленный: человек может напрямую ссылаться на навыки через свой набор
  • двунаправленный: каждый навык "ребенок" имеет один указатель назад до Человек (который не показан в вашем коде)

многие-ко-многим: один человек имеет много навыков, умения используют Человек(ы)

  • однонаправленный: человек может напрямую ссылаться на навыки через свой набор
  • двунаправленный: навык имеет набор людей, которые относятся к нему.

в отношениях " один ко многим "один объект является" родителем", а другой - "дочерним". Родитель контролирует существование ребенка. Во многих-ко-многим, существование любого типа зависит от чего-то вне их обоих (в большем контекст приложения.)

ваш предмет (домен) должен диктовать, является ли отношение один ко многим или много ко многим-однако я считаю, что создание отношения однонаправленного или двунаправленного-это инженерное решение, которое торгует памятью, обработкой, производительностью и т. д.

Что может сбить с толку, так это то, что двунаправленное отношение "многие ко многим" не обязательно должно быть симметричным! То есть куча людей могла бы указать на скилл, но скилл нужен не относитесь только к этим людям. Как правило, это было бы, но такая симметрия не является требованием. Возьмем, к примеру, любовь-она двунаправленная ("я-люблю", "любит-меня"), но часто асимметричная ("я люблю ее, но она меня не любит")!

все они хорошо поддерживаются Hibernate и JPA. Просто помните, что Hibernate или любой другой ORM не дает ухо о поддержании симметрии при управлении двунаправленными отношениями "многие ко многим"...это все зависит от приложения.

похоже, все отвечает One-to-many vs Many-to-many:

разницу между One-to-many,Many-to-one и Many-to-Many - это:

One-to-many vs Many-to-one - это вопрос перспективы. Unidirectional vs Bidirectional не повлияет на отображение, но будет иметь значение о том, как вы можете получить доступ к данным.

  • на One-to-many the many сторона будет держать ссылку one стороне. Хорошим примером является "человек имеет много навыков". В этом дело Person это одна сторона и Skill есть много побочных. Там будет колонка person_id в таблице skills.

на однонаправленныйPerson класса List<Skill> skills но Skill не будет Person person. В двунаправленный как свойства добавляются, и это позволяет получить доступ к Person дали умение (т. е. skill.person).

  • на Many-to-one много сторона будет нашей точкой зрения ссылка. Например, "у пользователя есть адрес". В нашей системе многие пользователи могут иметь общий адрес (например, несколько человек могут иметь один и тот же номер блока). В таком случае на users таблица будет совместно использоваться более чем одним users строк. В этом случае мы говорим, что users и addresses есть Many-to-one отношения.

на однонаправленный a User будет Address address. двунаправленный будет иметь дополнительный List<User> users на Address класса.

1) круги являются сущностями / POJOs / Beans

2) deg-это аббревиатура степени, как в графах (количество ребер)

PK=первичный ключ, FK=внешний ключ

обратите внимание на противоречие между степенью и название стороны. Многие соответствует степени=1, а один соответствует степени >1.

Illustration of one-to-many many-to-one

взгляните на эту статью: Отображение Отношений Объектов

есть две категории объектных отношений, которые необходимо учитывать при сопоставлении. Первая категория основана на множественности и включает в себя три типа:

*One-to-one relationships.  This is a relationship where the maximums of each of its multiplicities is one, an example of which is holds relationship between Employee and Position in Figure 11.  An employee holds one and only one position and a position may be held by one employee (some positions go unfilled).
*One-to-many relationships. Also known as a many-to-one relationship, this occurs when the maximum of one multiplicity is one and the other is greater than one.  An example is the works in relationship between Employee and Division.  An employee works in one division and any given division has one or more employees working in it.
*Many-to-many relationships. This is a relationship where the maximum of both multiplicities is greater than one, an example of which is the assigned relationship between Employee and Task.  An employee is assigned one or more tasks and each task is assigned to zero or more employees. 

вторая категория основана на направленность и она содержит два типы, однонаправленные отношения и двухнаправленный отношения.

*Uni-directional relationships.  A uni-directional relationship when an object knows about the object(s) it is related to but the other object(s) do not know of the original object.  An example of which is the holds relationship between Employee and Position in Figure 11, indicated by the line with an open arrowhead on it.  Employee objects know about the position that they hold, but Position objects do not know which employee holds it (there was no requirement to do so).  As you will soon see, uni-directional relationships are easier to implement than bi-directional relationships.
*Bi-directional relationships.  A bi-directional relationship exists when the objects on both end of the relationship know of each other, an example of which is the works in relationship between Employee and Division.  Employee objects know what division they work in and Division objects know what employees work in them. 

Это, вероятно, потребует много-ко-многим корабль отношения следующим образом



public class Person{

    private Long personId;
    @manytomany

    private Set skills;
    //Getters and setters
}

public class Skill{
    private Long skillId;
    private String skillName;
    @manyToMany(MappedBy="skills,targetClass="Person")
    private Set persons; // (people would not be a good convenion)
    //Getters and setters
}

возможно, Вам потребуется определить joinTable + JoinColumn, но он также может работать без него...

прежде всего, прочитайте весь мелкий шрифт. Обратите внимание, что NHibernate (таким образом, я предполагаю, что и Hibernate) реляционное отображение имеет забавное соответствие с отображением графов БД и объектов. Например, отношения "один к одному" часто реализуются как отношения "многие к одному".

во-вторых, прежде чем мы сможем сказать вам, как вы должны написать свою O/R карту, мы также должны увидеть вашу БД. В частности, может ли одним навыком обладать несколько человек? Если да, то у вас есть много-ко-многим отношения; в противном случае, это много-к-одному.

в-третьих, я предпочитаю не реализовывать отношения "многие ко многим" напрямую, а вместо этого моделировать "таблицу соединений" в вашей модели домена-т. е. рассматривать ее как сущность, например:

class PersonSkill 
{
    Person person;
    Skill skill;    
}

затем вы видите, что у вас есть? У вас есть два отношения "один ко многим". (В этом случае человек может иметь коллекцию PersonSkills, но не будет иметь коллекцию навыков.) Однако некоторые предпочтут использовать отношения "многие ко многим" (между человеком и умением); это спорно.

В-четвертых, если у вас есть двунаправленные отношения (например, не только у человека есть коллекция навыков, но и у навыка есть коллекция людей), NHibernate делает не принудительная двунаправленность в вашем BL для вас;он понимает только двунаправленность отношений для целей сохранения.

В-пятых, многие к одному гораздо проще использовать правильно в NHibernate (и я предполагаю, что спящий режим) чем один-ко-многим (сопоставление коллекция).

удачи!