Datamodel: Connections, Persons, Organizations and Contacts

A core part of the Novulo data model relates to Contacts, Organizations and Persons.

These components come from M3019 and are produced here. This post explains the model and the logic behind.

Contacts, Persons, organizations

Persons and organizations inherit from the contacts.

That means:

  1. Every person is a contact
  2. Every organization is a contact
  3. A contact can must be an organization or a person, but is never both
N_Org Organization N_Contact Contact N_Org->N_Contact inherits N_Pers Person N_Pers->N_Contact inherits

Inheritance is a technical setup which is not used often in the Novulo components, but it is actively used in this very common record type.

It means that two database records are treated as one.

  1. For every person record, there is a contact record with the same ID
  2. For every organization record, there is a contact record with the same ID
  3. As a result, a person and organization will never have the same ID. These two tables have gaps in their ID range

Contacts

Contacts represent all legal entities, either persons or organizations (including companies, governments or institutions), in your application. In the Reference Architecture, it’s referred to as the concept N_Contact

A contact is always twinned with either a Person, either an Organization. Both records inherit from the Contact and share the same ID.

The contact record stores all data that is used for legal entities irrespective of it being a Person or Organization.

Example: Sales
One feature of the contact, is the checkbox whether or not the contact is active as a sales contact.
A product can be sold to both organizations as persons. In the data model, the customer of a sales is a Contact.

Persons

Persons are natural persons. Here, information about the person can be stored, like first and last name. A person inherits from the Contact and is always twinned with this record type.

In the Reference Architecture, the concept is N_Person

Organizations

Any legal entity, not being a natural person (human), used in your application. It is used for your own organizations, customers, suppliers, suspects and prospects and any other entity you need to register.

It stores data specifically linked to organizations, like the Chamber of Commerce number or VAT registration.

The concept is N_Organization

Connection contacts

As part of CRM functionality, it is possible to link contacts to each other. This is done using the “Connections” functionality, with M3019 as the prime component producing this functionality.

There are three different possibilities to link contacts:

  1. To link Persons to Organizations. This is the most common used scenario, as it’s used to link employees to companies;
  2. To link Organizations to Organizations. This can be used to define relationships between organizations, like defining partnerships between organization, or that an organization is the holding company of another company;
  3. To link Persons to Persons. A typical use case is to define families or other relationships that can be relevant for products like insurance

This is done using a technical approach with two records of the same contact that mirror each other and are created automatically: The Connection contact, with the concept N_ContactContact.

Examples
John doe is employee of Novulo
Novulo is employer of John Doe

Fizor. is implementation partner of Novulo
Novulo is platform provider for Fizor.

John Doe is brother of Jack Doe
Jack Doe is brother of John Doe

N_Org Organization (employer) N_Pers Person (employee) N_ConnectionContact1 Connection contact N_ConnectionContact1->N_Org from N_ConnectionContact1->N_Pers to N_ConnectionContact2 Connection contact (opposite) N_ConnectionContact2->N_Org to N_ConnectionContact2->N_Pers from

Then, the two Connection Contacts refer to a Connection contact information. That record type is used to store data about the Connection. In a typical example for an employer, it stores the business e-mail of the Person. The concept is N_ContactContactInformation.

Example
John doe is employee of Novulo (Connection contact)
Novulo is employer of John Doe (Connection contact)
Business email: j.doe@novulo.com (Connection Information)

N_Org Organization (employer) N_Pers Person (employee) N_ConnectionContactInformation Connection contact information N_ConnectionContact1 Connection contact N_ConnectionContact1->N_Org from N_ConnectionContact1->N_Pers to N_ConnectionContact1->N_ConnectionContactInformation N_ConnectionContact2 Connection contact (opposite) N_ConnectionContact2->N_Org to N_ConnectionContact2->N_Pers from N_ConnectionContact2->N_ConnectionContactInformation

Types and configuration options

The Connection contacts have various types that can be set. This is related to the set-up above. Just like the Contacts and the information, there are two record types. Depending on the type, there are 2 or 3 records.

When the connection type has an ‘opposite’ type (e.g. “employer / employee”), there are 2 sub records to store the type.

N_ConnectionContactInformation Connection contact information N_ConnectionType N_ConnectionType N_ConnectionContactInformation->N_ConnectionType hidden N_ConnectionContact1 Connection contact N_ConnectionContact1->N_ConnectionContactInformation N_ConnectionContactType1 N_ConnectionContactType1 N_ConnectionContact1->N_ConnectionContactType1 type N_ConnectionContact2 Connection contact (opposite) N_ConnectionContact2->N_ConnectionContactInformation N_ConnectionContactType2 N_ConnectionContactType2 N_ConnectionContact2->N_ConnectionContactType2 type N_ConnectionContactType1->N_ConnectionType N_ConnectionContactType2->N_ConnectionType

When the connection is bilateral the same (e.g. brother/brother), there is no opposite type needed. In this case there are two settings records.

N_ConnectionContactInformation Connection contact information N_ConnectionType N_ConnectionType N_ConnectionContactInformation->N_ConnectionType hidden N_ConnectionContact1 Connection contact N_ConnectionContact1->N_ConnectionContactInformation N_ConnectionContactType1 N_ConnectionContactType1 N_ConnectionContact1->N_ConnectionContactType1 type N_ConnectionContact2 Connection contact (opposite) N_ConnectionContact2->N_ConnectionContactInformation N_ConnectionContact2->N_ConnectionContactType1 type N_ConnectionContactType1->N_ConnectionType

At the moment of writing (27 May 2024; M3019 r2167, there’s discrepancy between the names of the record types in the application and the reference architecture. As soon as this is harmonized, this post will be updated.

2 Likes