← Вернуться к лендингу недели 37 Артефакт 1. Шаблон структуры БД
Проект «Наследие» · Неделя 37 · Квартал 4
Назначение: Реляционная база данных для генеалогического исследования с возможностью кросс-анализа и статистики.
СУБД: PostgreSQL / SQLite / Яндекс Таблицы (веб-вариант)
Принцип: Данные первичны. Древо — производное. Аналитика — надстройка.
1. Общая архитектура
База состоит из девяти основных таблиц и семи связующих (many-to-many).
PERSONS ──┬── PERSON_EVENTS ──── EVENTS ──── EVENT_PLACES ──── PLACES
├── PERSON_SOURCES ─── SOURCES ─── SOURCE_MEDIA ──── MEDIA
├── RELATIONS
├── PERSON_BRANCHES ── BRANCHES
└── PERSON_TAGS ────── TAGS (аналитические метки) 2. Основные таблицы
2.1. PERSONS — Персоны
| Поле | Тип | Обязательное | Описание |
| person_id | VARCHAR(10) | Да | Уникальный ID (P000001) |
| surname | VARCHAR(100) | Да | Фамилия |
| name | VARCHAR(100) | Да | Имя |
| patronymic | VARCHAR(100) | Нет | Отчество |
| maiden_name | VARCHAR(100) | Нет | Девичья фамилия |
| gender | CHAR(1) | Да | М / Ж |
| birth_date_min | DATE | Нет | Ранняя граница рождения |
| birth_date_max | DATE | Нет | Поздняя граница рождения |
| death_date_min | DATE | Нет | Ранняя граница смерти |
| death_date_max | DATE | Нет | Поздняя граница смерти |
| is_alive | BOOLEAN | Да | Жив ли |
| generation | INT | Нет | Номер поколения |
| social_status | VARCHAR(50) | Нет | Сословие |
| occupation | VARCHAR(100) | Нет | Занятие |
| status | ENUM | Да | Подтверждено / Гипотеза / Предание / Опровергнуто |
| confidence | ENUM | Да | Высокая / Средняя / Низкая |
| comment | TEXT | Нет | Комментарий исследователя |
| verified_by | VARCHAR(100) | Нет | Кто проверял |
| verification_date | DATE | Нет | Когда проверено |
| created_at | TIMESTAMP | Да | Дата создания |
| updated_at | TIMESTAMP | Да | Дата изменения |
2.2. EVENTS — События
| Поле | Тип | Обязательное | Описание |
| event_id | VARCHAR(10) | Да | E000001 |
| event_type | ENUM | Да | Рождение / Брак / Смерть / Переезд / Служба / Война / Репрессия / Учёба / Работа / Прочее |
| event_date_min | DATE | Нет | Ранняя граница |
| event_date_max | DATE | Нет | Поздняя граница |
| description | TEXT | Нет | Описание |
| status | ENUM | Да | Подтверждено / Гипотеза / Предание |
| confidence | ENUM | Да | Высокая / Средняя / Низкая |
| comment | TEXT | Нет | Комментарий |
2.3. PLACES — Места
| Поле | Тип | Обязательное | Описание |
| place_id | VARCHAR(10) | Да | PL00001 |
| name_historical | VARCHAR(150) | Да | Историческое название |
| name_modern | VARCHAR(150) | Нет | Современное название |
| place_type | ENUM | Да | Село / Деревня / Город / Уезд / Губерния / Область / Станица |
| parent_place_id | VARCHAR(10) | Нет | Вышестоящая единица |
| adm_unit_1730 | VARCHAR(100) | Нет | На 1730 |
| adm_unit_1900 | VARCHAR(100) | Нет | На 1900 |
| adm_unit_1950 | VARCHAR(100) | Нет | На 1950 |
| adm_unit_modern | VARCHAR(100) | Нет | Современная |
| latitude | DECIMAL(9,6) | Нет | Широта |
| longitude | DECIMAL(9,6) | Нет | Долгота |
| comment | TEXT | Нет | Комментарий |
2.4. SOURCES — Источники
| Поле | Тип | Обязательное | Описание |
| source_id | VARCHAR(10) | Да | S000001 |
| source_type | ENUM | Да | Метрика / Ревизия / Исповедная / Архивное дело / Интервью / Фото / Газета / Книга / Карта |
| title | VARCHAR(255) | Да | Название |
| archive | VARCHAR(150) | Нет | Архив |
| fund | VARCHAR(50) | Нет | Фонд |
| inventory | VARCHAR(50) | Нет | Опись |
| case_number | VARCHAR(50) | Нет | Дело |
| page | VARCHAR(50) | Нет | Лист |
| year_start | INT | Нет | Год начала |
| year_end | INT | Нет | Год конца |
| source_level | ENUM | Да | Первичный / Вторичный / Третичный |
| reliability | ENUM | Да | Высокая / Средняя / Низкая |
| url | VARCHAR(500) | Нет | Ссылка на оцифровку |
| comment | TEXT | Нет | Комментарий |
2.5. MEDIA — Медиафайлы
| Поле | Тип | Обязательное | Описание |
| media_id | VARCHAR(10) | Да | M000001 |
| media_type | ENUM | Да | Фото / Скан / Аудио / Видео / Карта |
| file_path | VARCHAR(500) | Да | Путь к файлу |
| description | TEXT | Нет | Описание |
| date_min | DATE | Нет | Ранняя дата |
| date_max | DATE | Нет | Поздняя дата |
| place_id | VARCHAR(10) | Нет | Где сделано |
| comment | TEXT | Нет | Комментарий |
2.6. RELATIONS — Связи
| Поле | Тип | Обязательное | Описание |
| relation_id | VARCHAR(10) | Да | R000001 |
| person_id_1 | VARCHAR(10) | Да | Персона 1 |
| person_id_2 | VARCHAR(10) | Да | Персона 2 |
| relation_type | ENUM | Да | Отец-сын / Мать-дочь / Муж-жена / Брат-сестра |
| status | ENUM | Да | Подтверждено / Гипотеза / Предание |
| comment | TEXT | Нет | Комментарий |
2.7. BRANCHES — Ветви рода
| Поле | Тип | Обязательное | Описание |
| branch_id | VARCHAR(10) | Да | B001 |
| branch_name | VARCHAR(100) | Да | «Изюмская», «Вологодская» |
| geography | VARCHAR(255) | Нет | Основной регион |
| description | TEXT | Нет | Описание |
2.8. TAGS — Аналитические метки
| Поле | Тип | Обязательное | Описание |
| tag_id | VARCHAR(10) | Да | T0001 |
| tag_name | VARCHAR(100) | Да | «Участник ВОВ», «Репрессирован» |
| tag_category | VARCHAR(50) | Да | Война / Репрессии / Миграция / Профессия / Демография |
| description | TEXT | Нет | Что означает |
3. Связующие таблицы
| Таблица | Поля | Назначение |
| PERSON_EVENTS | person_id, event_id, role | Кто и в каком событии |
| PERSON_SOURCES | person_id, source_id | Кто из какого источника |
| EVENT_PLACES | event_id, place_id | Где произошло событие |
| SOURCE_MEDIA | source_id, media_id | Медиа источника |
| PERSON_MEDIA | person_id, media_id | Медиа персоны |
| PERSON_BRANCHES | person_id, branch_id | Кто в какой ветви |
| PERSON_TAGS | person_id, tag_id | Аналитические метки |
4. Методологические поля — сводка
Три ключевых поля в каждой таблице:
status — Подтверждено / Гипотеза / Предание / Опровергнуто confidence — Высокая / Средняя / Низкая comment — свободный текст исследователя
В SOURCES добавляются source_level и reliability.
5. Пример заполнения (3 персоны)
PERSONS:
| person_id | surname | name | birth | death | generation | social_status | status | confidence |
| P000001 | Петров | Иван | ~1730 | ~1790 | 1 | Казак | Подтверждено | Средняя |
| P000002 | Петрова | Анна | ~1735 | ~1800 | 1 | Казачка | Гипотеза | Низкая |
| P000003 | Петров | Григорий | ~1760 | ~1830 | 2 | Гос. крестьянин | Подтверждено | Высокая |
EVENTS:
| event_id | event_type | date | description | status |
| E000001 | Служба | 1735–1739 | Участие в русско-турецкой войне | Гипотеза |
| E000002 | Брак | ~1755 | Брак с Анной | Предание |
| E000003 | Переезд | ~1795 | Переезд в Мелитопольский уезд | Подтверждено |
SOURCES:
| source_id | source_type | title | archive | fund | source_level | reliability |
| S000001 | Ревизия | Ревизская сказка 1745 | ГАХО | ф. 31 | Первичный | Высокая |
| S000002 | Исповедная | Ведомость 1760 | ГАХО | ф. 40 | Первичный | Средняя |
| S000003 | Интервью | Запись внучки, 1998 | Личный архив | — | Третичный | Средняя |
TAGS:
| tag_id | tag_name | tag_category |
| T0001 | Участник русско-турецкой войны | Война |
| T0002 | Переселенец в Новороссию | Миграция |
| T0003 | Казачье сословие | Сословие |
6. Что это даёт для кросс-анализа
Примеры SQL-запросов (или фильтров в Airtable/Яндекс Таблицах):
SELECT tag_name, COUNT(*) FROM PERSON_TAGS
JOIN TAGS ON PERSON_TAGS.tag_id = TAGS.tag_id
WHERE tag_category = 'Война' GROUP BY tag_name;
SELECT generation, COUNT(*) FROM PERSONS GROUP BY generation;
SELECT status, COUNT(*) FROM PERSONS GROUP BY status;
💡 Вывод: правильно построенная БД — это не просто склад. Это инструмент, который сам отвечает на вопросы исследователя. Однажды заполнив таблицы, вы сможете строить любые отчёты за секунды.
← Вернуться к лендингу недели 37