DGIndividual Table
The DGIndividual table holds the people inside DNAGedcom’s unified, service-independent family trees. Each row is one person in one tree. A tree therefore produces many rows, all linked back to their parent DGTree row through the treeid column.
Whether a person originally came from a GEDCOM file you uploaded, an FTDNA or MyHeritage match tree, or a WikiTree branch, that person is flattened into the same column shape here. This is what lets the People view and the Common Ancestor tools line up individuals across trees from different services.
Link to the tree: DGIndividual.treeid is an integer that holds the parent DGTree.Id — not the service’s own tree key. The relationship between people is expressed through personId, fatherId, motherId, and spouseId, which reference other individuals’ personId values within the same tree.
Column Reference
Identifiers & Links
| Column | Type | Description |
| Id | int (PK) | Auto-incrementing primary key. |
| treeid | int | The parent tree. Holds the DGTree.Id of the tree this person belongs to. |
| matchid | string | The encrypted kit/match id of the match this tree was gathered from, when applicable. |
| personId | string | The person’s identifier within the tree. Referenced by other rows’ fatherId, motherId, and spouseId. |
| fatherId | string | personId of this person’s father within the same tree. |
| motherId | string | personId of this person’s mother within the same tree. |
| spouseId | string | personId of this person’s spouse. Not populated by the gather paths; present for trees that supply it. |
| relid | string | Ahnentafel relationship number relative to the tree root (root = 1, a person’s father = 2×relid, mother = 2×relid+1). See the note below — it is generally empty on DGIndividual rows. |
| source | string | Which pipeline produced the person — the same value carried on the parent DGTree (e.g. “gedcom”, “FTDNA”, “WikiTree”, “MyHeritage”). |
Person
| Column | Type | Description |
| surname | string | Last (family) name. |
| given | string | Given (first) name. |
| sex | string | Gender, normalized to “M”, “F”, or “U” (unknown). |
Birth & Death
| Column | Type | Description |
| birthdate | string | Birth date as recorded in the source tree (free text, e.g. a year or a full date). |
| birthplace | string | Birth place as recorded in the source tree. |
| deathdate | string | Death date as recorded in the source tree. |
| deathplace | string | Death place as recorded in the source tree. |
| birthdt1 | DateTime | Parsed birth date (lower bound of a date range). Derived from birthdate where a date could be parsed. Often left at the default DateTime value (0001-01-01) when no date was parsed. |
| birthdt2 | DateTime | Intended upper bound of a parsed birth-date range. Legacy/unused — never assigned, so it stays at the default DateTime value. |
| deathdt1 | DateTime | Parsed death date (lower bound of a date range). Derived from deathdate where a date could be parsed. Often left at the default DateTime value. |
| deathdt2 | DateTime | Intended upper bound of a parsed death-date range. Legacy/unused — never assigned, so it stays at the default DateTime value. |
Tracking
| Column | Type | Description |
| created_date | string | When the row was created, stored as a yyyy-MM-dd string. |
About relid: The ahnentafel scheme (root = 1, father = 2×relid, mother = 2×relid+1) is real, but in practice the gather and GEDCOM-upload paths do not assign relid on DGIndividual rows, so the column is generally empty here. The same ahnentafel numbering is populated on the A* tree table (Ancestry_matchTrees.relid) and in the CSV export pipeline; DNAGedcom’s tree-comparison code reads the value when one is present.
How It’s Populated
Rows are inserted alongside their parent DGTree row whenever a tree is brought into DNAGedcom. Each producer reads its own upstream format and writes the same flattened person shape:
- GEDCOM upload — the uploaded file is parsed into individuals;
personId, given, surname, birthdate/birthplace, deathdate/deathplace, and sex are taken from the file, and fatherId/motherId are resolved from the GEDCOM family links. treeid, source (“gedcom”), and created_date are then stamped on.
- FTDNA, WikiTree, MyHeritage — gathered match trees set
source to the service name, treeid to the parent DGTree.Id, matchid to the match’s encrypted kit, names and birth/death fields from the service’s tree data, sex normalized to M/F/U, and created_date to the current date. fatherId and motherId are filled in from the tree’s family/relationship block after the people are created.
De-duplication: Before inserting, the app checks for an existing individual with the same source and personId, so the same person is not stored twice within a source.
Related Tables
- DGTree — the tree each person belongs to.
DGIndividual.treeid holds the parent DGTree.Id.
- Kit_TreeAssignment — assigns a tree to a DNA kit by
DGTree.Id, which in turn determines which DGIndividual rows describe that kit’s tree.
- Match_TreeOverride — points a single match at a better tree (by
DGTree.Id), selecting a different set of DGIndividual rows for that match.
- Computed_CommonAncestors — the common-ancestor computation walks DGIndividual rows (via
personId/fatherId/motherId) to find ancestors shared between kits.