---
title: "person"
description: "Demographics and administrative information about a person independent of a specific health-related context."
---

Demographics and administrative information about a person independent of a specific health-related context.

## Source

| Model | Leg | Role |
|---|---|---|
| `Person` | FHIR | defines this table |
| `openEHR-EHR-CLUSTER.address.v1` | openEHR | merged in — Address |
| `openEHR-EHR-CLUSTER.electronic_communication.v1` | openEHR | merged in — Electronic communication |
| `openEHR-EHR-CLUSTER.person.v1` | openEHR | merged in — Person |

> This table is the union of 4 source models. Columns carrying a **From** value came from a model that merged into it, so the same row satisfies both specifications.

## Columns

| Column | Type | Null | Description | From | Source |
|---|---|---|---|---|---|
| `id` | `uuid primary key` | no | Person.id | — | — |
| `created_at` | `timestamptz` | no | Row creation timestamp. | — | — |
| `updated_at` | `timestamptz` | no | Row update timestamp; maintained by the application. | — | — |
| `created_by` | `text` | no | Actor who created the row. | — | — |
| `updated_by` | `text` | no | Actor who last updated the row. | — | — |
| `identifier_value`<br />`identifier_system` | text, text<br />`text`, `text` | yes | A human identifier for this person | — | `Person.identifier` |
| `name_text`<br />`name_prefix`<br />`name_family`<br />`name_given`<br />`name_suffix` | text, text, text, text, text<br />`text`, `text`, `text`, `text`, `text` | yes | A name associated with the person | — | `Person.name` |
| `phone_number`<br />`phone_use_code`<br />`email`<br />`email_use_code` | text, text, text, text<br />`text`, `text`, `text`, `text` | yes | A contact detail for the person | — | `Person.telecom` |
| `gender` | `text` | yes | male \| female \| other \| unknown | — | `Person.gender` |
| `birth_date` | `date` | yes | The date on which the person was born | — | `Person.birthDate` |
| `address_line`<br />`address_city`<br />`address_district`<br />`address_state`<br />`address_postal_code`<br />`address_country`<br />`address_use_code`<br />`address_type_code` | text, text, text, text, text, text, text, text<br />`text`, `text`, `text`, `text`, `text`, `text`, `text`, `text` | yes | One or more addresses for the person | — | `Person.address` |
| `photo` | `uuid` → [`attachment`](/docs/tables/attachment) | yes | Image of the person | — | `Person.photo` |
| `managing_organization_id` | `uuid` | yes | The organization that is the custodian of the person record | — | `Person.managingOrganization` |
| `active` | `boolean` | yes | This person's record is in active use | — | `Person.active` |
| `address_latitude_magnitude`<br />`address_latitude_units` | quantity<br />`numeric`, `text` | yes | Latitude | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0007]` |
| `address_longitude_magnitude`<br />`address_longitude_units` | quantity<br />`numeric`, `text` | yes | Longitude | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0008]` |
| `address_altitude_magnitude`<br />`address_altitude_units` | quantity<br />`numeric`, `text` | yes | Altitude | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0009]` |
| `address_comment` | `text` | yes | Comment | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0018]` |
| `address_map_url` | `text` | yes | Map URL | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0019]` |
| `address_geolocation_code` | `text` | yes | Geolocation code | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0021]` |
| `phone_comment`<br />`email_comment` | text, text<br />`text`, `text` | yes | Comment | `openEHR-EHR-CLUSTER.electronic_communication.v1` | `/items[at0004]` |
| `role` | `text` | yes | Role | `openEHR-EHR-CLUSTER.person.v1` | `/items[at0004]` |
| `comment` | `text` | yes | Comment | `openEHR-EHR-CLUSTER.person.v1` | `/items[at0010]` |
| `label` | `text` | yes | Label | `openEHR-EHR-CLUSTER.person.v1` | `/items[at0011]` |

## Constraints

```sql
check (identifier_system is null or identifier_value is not null)
check ((address_latitude_magnitude is null and address_latitude_units is null) or (address_latitude_magnitude is not null and address_latitude_units is not null))
check (address_latitude_magnitude is null or (address_latitude_units = 'deg' and address_latitude_magnitude between -90 and 90))
check ((address_longitude_magnitude is null and address_longitude_units is null) or (address_longitude_magnitude is not null and address_longitude_units is not null))
check (address_longitude_magnitude is null or (address_longitude_units = 'deg' and address_longitude_magnitude between -180 and 180))
check ((address_altitude_magnitude is null and address_altitude_units is null) or (address_altitude_magnitude is not null and address_altitude_units is not null))
```

## References

| Columns | Target | On delete |
|---|---|---|
| `photo` | [`attachment`](/docs/tables/attachment) | restrict |
| `managing_organization_id` | [`organization`](/docs/tables/organization) | no action |

## Referenced by

24 tables reference `person`, via `person_id`. The first 15 alphabetically:

- [`advance_care_directive_witness`](/docs/tables/advance_care_directive_witness) via `person_id`
- [`advance_care_directive_directive_location`](/docs/tables/advance_care_directive_directive_location) via `copy_holder`
- [`adverse_reaction_event_information_source`](/docs/tables/adverse_reaction_event_information_source) via `person_id`
- [`exposure_screening_specific_exposure_additional_details`](/docs/tables/exposure_screening_specific_exposure_additional_details) via `person_id`
- [`family_history_per_family_member_family_member_details`](/docs/tables/family_history_per_family_member_family_member_details) via `person_id`
- [`functional_support_requirements_support_person_details`](/docs/tables/functional_support_requirements_support_person_details) via `person_id`
- [`imaging_exam_result`](/docs/tables/imaging_exam_result) via `distribution_list_person`
- [`imaging_exam_result_examination_request_details_requester`](/docs/tables/imaging_exam_result_examination_request_details_requester) via `person_id`
- [`laboratory_test_result_test_request_details`](/docs/tables/laboratory_test_result_test_request_details) via `requester`
- [`person_other_identifier`](/docs/tables/person_other_identifier) via `person_id`
- [`person_other_name`](/docs/tables/person_other_name) via `person_id`
- [`person_other_telecom`](/docs/tables/person_other_telecom) via `person_id`
- [`person_other_address`](/docs/tables/person_other_address) via `person_id`
- [`person_link`](/docs/tables/person_link) via `person_id`
- [`person_link`](/docs/tables/person_link) via `target_person_id`

## Indexes

- `person_photo_idx` on `photo`
- `person_managing_organization_id_idx` on `managing_organization_id`

## Child tables

5 tables hang off `person`, one row per repetition.

### `person_other_identifier`

Child table — one row per repetition, deleted with its parent.

| Column | Type | Null | Description | From | Source |
|---|---|---|---|---|---|
| `id` | `uuid primary key` | no | Primary key. | — | — |
| `person_id` | `uuid` → [`person`](/docs/tables/person) | no | — | — | — |
| `identifier_value` | `text` | no | — | — | — |
| `identifier_system` | `text` | yes | — | — | — |
| `identifier_use` | `text` | yes | — | — | — |
| `valid_from` | `timestamptz` | yes | — | — | — |
| `valid_until` | `timestamptz` | yes | — | — | — |

#### Unique

- `person_id, identifier_system, identifier_value`

#### References

| Columns | Target | On delete |
|---|---|---|
| `person_id` | [`person`](/docs/tables/person) | cascade |

### `person_other_name`

Child table — one row per repetition, deleted with its parent.

| Column | Type | Null | Description | From | Source |
|---|---|---|---|---|---|
| `id` | `uuid primary key` | no | Primary key. | — | — |
| `person_id` | `uuid` → [`person`](/docs/tables/person) | no | — | — | — |
| `use_code` | `text` | yes | — | — | — |
| `name_text` | `text` | yes | — | — | — |
| `name_prefix` | `text` | yes | — | — | — |
| `name_family` | `text` | yes | — | — | — |
| `name_given` | `text` | yes | — | — | — |
| `name_suffix` | `text` | yes | — | — | — |
| `valid_from` | `timestamptz` | yes | — | — | — |
| `valid_until` | `timestamptz` | yes | — | — | — |

#### References

| Columns | Target | On delete |
|---|---|---|
| `person_id` | [`person`](/docs/tables/person) | cascade |

#### Indexes

- `person_other_name_person_id_idx` on `person_id`

### `person_other_telecom`

Child table — one row per repetition, deleted with its parent.

| Column | Type | Null | Description | From | Source |
|---|---|---|---|---|---|
| `id` | `uuid primary key` | no | Primary key. | — | — |
| `person_id` | `uuid` → [`person`](/docs/tables/person) | no | — | — | — |
| `system` | `text` | no | — | — | — |
| `value` | `text` | no | — | — | — |
| `use_code` | `text` | yes | — | — | — |
| `rank` | `integer` | yes | — | — | — |
| `valid_from` | `timestamptz` | yes | — | — | — |
| `valid_until` | `timestamptz` | yes | — | — | — |
| `comment` | `text` | yes | Comment | `openEHR-EHR-CLUSTER.electronic_communication.v1` | `/items[at0004]` |

#### References

| Columns | Target | On delete |
|---|---|---|
| `person_id` | [`person`](/docs/tables/person) | cascade |

#### Indexes

- `person_other_telecom_person_id_idx` on `person_id`

### `person_other_address`

Child table — one row per repetition, deleted with its parent.

| Column | Type | Null | Description | From | Source |
|---|---|---|---|---|---|
| `id` | `uuid primary key` | no | Primary key. | — | — |
| `person_id` | `uuid` → [`person`](/docs/tables/person) | no | — | — | — |
| `address_line` | `text` | yes | newline-delimited for multiple lines | — | — |
| `address_city` | `text` | yes | — | — | — |
| `address_district` | `text` | yes | — | — | — |
| `address_state` | `text` | yes | — | — | — |
| `address_postal_code` | `text` | yes | — | — | — |
| `address_country` | `text` | yes | — | — | — |
| `use_code` | `text` | yes | — | — | — |
| `type_code` | `text` | yes | — | — | — |
| `valid_from` | `timestamptz` | yes | — | — | — |
| `valid_until` | `timestamptz` | yes | — | — | — |
| `address_latitude_magnitude`<br />`address_latitude_units` | quantity<br />`numeric`, `text` | yes | Latitude | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0007]` |
| `address_longitude_magnitude`<br />`address_longitude_units` | quantity<br />`numeric`, `text` | yes | Longitude | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0008]` |
| `address_altitude_magnitude`<br />`address_altitude_units` | quantity<br />`numeric`, `text` | yes | Altitude | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0009]` |
| `address_comment` | `text` | yes | Comment | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0018]` |
| `address_map_url` | `text` | yes | Map URL | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0019]` |
| `address_geolocation_code` | `text` | yes | Geolocation code | `openEHR-EHR-CLUSTER.address.v1` | `/items[at0021]` |

#### Constraints

```sql
check ((address_latitude_magnitude is null and address_latitude_units is null) or (address_latitude_magnitude is not null and address_latitude_units is not null))
check (address_latitude_magnitude is null or (address_latitude_units = 'deg' and address_latitude_magnitude between -90 and 90))
check ((address_longitude_magnitude is null and address_longitude_units is null) or (address_longitude_magnitude is not null and address_longitude_units is not null))
check (address_longitude_magnitude is null or (address_longitude_units = 'deg' and address_longitude_magnitude between -180 and 180))
check ((address_altitude_magnitude is null and address_altitude_units is null) or (address_altitude_magnitude is not null and address_altitude_units is not null))
```

#### References

| Columns | Target | On delete |
|---|---|---|
| `person_id` | [`person`](/docs/tables/person) | cascade |

#### Indexes

- `person_other_address_person_id_idx` on `person_id`

### `person_link`

Child table — one row per repetition, deleted with its parent.

| Column | Type | Null | Description | From | Source |
|---|---|---|---|---|---|
| `id` | `uuid primary key` | no | Primary key. | — | — |
| `person_id` | `uuid` → [`person`](/docs/tables/person) | no | — | — | — |
| `target_patient_id`<br />`target_person_id`<br />`target_practitioner_id`<br />`target_related_person_id` | uuid, uuid, uuid, uuid<br />`uuid`, `uuid`, `uuid`, `uuid` | yes | The resource to which this actual person is associated | — | `Person.link.target` |
| `assurance` | `text` | yes | level1 \| level2 \| level3 \| level4 | — | `Person.link.assurance` |

#### Constraints

```sql
check (num_nonnulls(target_patient_id, target_person_id, target_practitioner_id, target_related_person_id) <= 1)
```

#### References

| Columns | Target | On delete |
|---|---|---|
| `person_id` | [`person`](/docs/tables/person) | cascade |
| `target_patient_id` | [`patient`](/docs/tables/patient) | no action |
| `target_person_id` | [`person`](/docs/tables/person) | no action |
| `target_practitioner_id` | [`practitioner`](/docs/tables/practitioner) | no action |
| `target_related_person_id` | [`related_person`](/docs/tables/related_person) | no action |

#### Indexes

- `person_link_person_id_idx` on `person_id`
- `person_link_target_patient_id_idx` on `target_patient_id`
- `person_link_target_person_id_idx` on `target_person_id`
- `person_link_target_practitioner_id_idx` on `target_practitioner_id`
- `person_link_target_related_person_id_idx` on `target_related_person_id`

