Если посмотреть на эти три стандартных объекта и связи между ними в «Schema Builder», то увиденное не совсем поддается логике, по которой эти объекты взаимодействуют между собой в реальности. Хотя поведение этих объектов детально описано в документации Salesforce, и если уделить немного времени, то можно найти немало информации по этому поводу. Так как ее даже чересчур много — постараюсь кратко описать все в одном месте.
Account Opportunity Relationship
Как известно, между этими объектами существует связь «Master-detail» и она хорошо описана в документации. Но если посмотреть на поля объекта Opportunity, то мы не увидим связи «Master-detail», только «Lookup».
Что нам позволяет сделать эта связь?
Как «Master-detail»:
-
На объекте Account мы можем создавать «Roll-Up Summary» поля на объект Opportunity;
-
При удалении записи Account, удаляются и все связанные записи Opportunity;
Как «Lookup»:
- При создании записи Opportunity не обязательно указывать Account как родительский объект;
Account Contact Relationship
Если посмотреть на объекты Account и Contact, то между ними существует «Lookup» связь, которая имеет другую логику поведения.
Как «Master-detail»:
- При удалении записи Account, удаляются и все связанные записи Contact;
Как «Lookup»:
-
При создании записи Contact не обязательно указывать Account как родительский объект;
-
На объекте Account мы не можем создавать «Roll-Up Summary» поля;
Еще между этими объектами существует изначально скрытая связь “многие ко многим”. Для этого нужно в настройках Account включить Contacts to Multiple Accounts.
При включении этой настройки на Page Layouts обоих объектов можно добавить Related List, Contacts или Accounts. В качестве Junction object выступает AccountContactRelation объект.
AccountContactRelation не видно ни через Object Manager, ни через Schema Builder, но его можно получить через SOQL запрос:
SELECT id, (SELECT ContactId FROM AccountContactRelations) FROM Account
или
SELECT id, (SELECT AccountId FROM AccountContactRelations) FROM Contact
Opportunity Contact Relationship
Предварительно, если посмотреть на поля этих объектов, то между ними нет никакой связи. Но если копнуть глубже, то между ними тоже существует связь “многие ко многим”. Для этого существует Junction object «OpportunityContactRole», то есть, используя стандартные связи, мы можем подвязать Opportunity записи к Contact записям, и наоборот.
Обращаться к объекту можно через SOQL запрос:
SELECT Id, (SELECT ContactId FROM OpportunityContactRoles) FROM Opportunity
или
SELECT Id, (SELECT OpportunityId FROM OpportunityContactRoles) FROM Contact