Шаблон структуры БД | Неделя 37
← Вернуться к лендингу недели 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_idVARCHAR(10)ДаУникальный ID (P000001)
surnameVARCHAR(100)ДаФамилия
nameVARCHAR(100)ДаИмя
patronymicVARCHAR(100)НетОтчество
maiden_nameVARCHAR(100)НетДевичья фамилия
genderCHAR(1)ДаМ / Ж
birth_date_minDATEНетРанняя граница рождения
birth_date_maxDATEНетПоздняя граница рождения
death_date_minDATEНетРанняя граница смерти
death_date_maxDATEНетПоздняя граница смерти
is_aliveBOOLEANДаЖив ли
generationINTНетНомер поколения
social_statusVARCHAR(50)НетСословие
occupationVARCHAR(100)НетЗанятие
statusENUMДаПодтверждено / Гипотеза / Предание / Опровергнуто
confidenceENUMДаВысокая / Средняя / Низкая
commentTEXTНетКомментарий исследователя
verified_byVARCHAR(100)НетКто проверял
verification_dateDATEНетКогда проверено
created_atTIMESTAMPДаДата создания
updated_atTIMESTAMPДаДата изменения

2.2. EVENTS — События

ПолеТипОбязательноеОписание
event_idVARCHAR(10)ДаE000001
event_typeENUMДаРождение / Брак / Смерть / Переезд / Служба / Война / Репрессия / Учёба / Работа / Прочее
event_date_minDATEНетРанняя граница
event_date_maxDATEНетПоздняя граница
descriptionTEXTНетОписание
statusENUMДаПодтверждено / Гипотеза / Предание
confidenceENUMДаВысокая / Средняя / Низкая
commentTEXTНетКомментарий

2.3. PLACES — Места

ПолеТипОбязательноеОписание
place_idVARCHAR(10)ДаPL00001
name_historicalVARCHAR(150)ДаИсторическое название
name_modernVARCHAR(150)НетСовременное название
place_typeENUMДаСело / Деревня / Город / Уезд / Губерния / Область / Станица
parent_place_idVARCHAR(10)НетВышестоящая единица
adm_unit_1730VARCHAR(100)НетНа 1730
adm_unit_1900VARCHAR(100)НетНа 1900
adm_unit_1950VARCHAR(100)НетНа 1950
adm_unit_modernVARCHAR(100)НетСовременная
latitudeDECIMAL(9,6)НетШирота
longitudeDECIMAL(9,6)НетДолгота
commentTEXTНетКомментарий

2.4. SOURCES — Источники

ПолеТипОбязательноеОписание
source_idVARCHAR(10)ДаS000001
source_typeENUMДаМетрика / Ревизия / Исповедная / Архивное дело / Интервью / Фото / Газета / Книга / Карта
titleVARCHAR(255)ДаНазвание
archiveVARCHAR(150)НетАрхив
fundVARCHAR(50)НетФонд
inventoryVARCHAR(50)НетОпись
case_numberVARCHAR(50)НетДело
pageVARCHAR(50)НетЛист
year_startINTНетГод начала
year_endINTНетГод конца
source_levelENUMДаПервичный / Вторичный / Третичный
reliabilityENUMДаВысокая / Средняя / Низкая
urlVARCHAR(500)НетСсылка на оцифровку
commentTEXTНетКомментарий

2.5. MEDIA — Медиафайлы

ПолеТипОбязательноеОписание
media_idVARCHAR(10)ДаM000001
media_typeENUMДаФото / Скан / Аудио / Видео / Карта
file_pathVARCHAR(500)ДаПуть к файлу
descriptionTEXTНетОписание
date_minDATEНетРанняя дата
date_maxDATEНетПоздняя дата
place_idVARCHAR(10)НетГде сделано
commentTEXTНетКомментарий

2.6. RELATIONS — Связи

ПолеТипОбязательноеОписание
relation_idVARCHAR(10)ДаR000001
person_id_1VARCHAR(10)ДаПерсона 1
person_id_2VARCHAR(10)ДаПерсона 2
relation_typeENUMДаОтец-сын / Мать-дочь / Муж-жена / Брат-сестра
statusENUMДаПодтверждено / Гипотеза / Предание
commentTEXTНетКомментарий

2.7. BRANCHES — Ветви рода

ПолеТипОбязательноеОписание
branch_idVARCHAR(10)ДаB001
branch_nameVARCHAR(100)Да«Изюмская», «Вологодская»
geographyVARCHAR(255)НетОсновной регион
descriptionTEXTНетОписание

2.8. TAGS — Аналитические метки

ПолеТипОбязательноеОписание
tag_idVARCHAR(10)ДаT0001
tag_nameVARCHAR(100)Да«Участник ВОВ», «Репрессирован»
tag_categoryVARCHAR(50)ДаВойна / Репрессии / Миграция / Профессия / Демография
descriptionTEXTНетЧто означает

3. Связующие таблицы

ТаблицаПоляНазначение
PERSON_EVENTSperson_id, event_id, roleКто и в каком событии
PERSON_SOURCESperson_id, source_idКто из какого источника
EVENT_PLACESevent_id, place_idГде произошло событие
SOURCE_MEDIAsource_id, media_idМедиа источника
PERSON_MEDIAperson_id, media_idМедиа персоны
PERSON_BRANCHESperson_id, branch_idКто в какой ветви
PERSON_TAGSperson_id, tag_idАналитические метки

4. Методологические поля — сводка

Три ключевых поля в каждой таблице:

  • status — Подтверждено / Гипотеза / Предание / Опровергнуто
  • confidence — Высокая / Средняя / Низкая
  • comment — свободный текст исследователя

В SOURCES добавляются source_level и reliability.

5. Пример заполнения (3 персоны)

PERSONS:

person_idsurnamenamebirthdeathgenerationsocial_statusstatusconfidence
P000001ПетровИван~1730~17901КазакПодтвержденоСредняя
P000002ПетроваАнна~1735~18001КазачкаГипотезаНизкая
P000003ПетровГригорий~1760~18302Гос. крестьянинПодтвержденоВысокая

EVENTS:

event_idevent_typedatedescriptionstatus
E000001Служба1735–1739Участие в русско-турецкой войнеГипотеза
E000002Брак~1755Брак с АннойПредание
E000003Переезд~1795Переезд в Мелитопольский уездПодтверждено

SOURCES:

source_idsource_typetitlearchivefundsource_levelreliability
S000001РевизияРевизская сказка 1745ГАХОф. 31ПервичныйВысокая
S000002ИсповеднаяВедомость 1760ГАХОф. 40ПервичныйСредняя
S000003ИнтервьюЗапись внучки, 1998Личный архивТретичныйСредняя

TAGS:

tag_idtag_nametag_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