**Документация топонимической базы данных chuv_topo_DB**

## Обзор
Эта база данных предназначена для систематического хранения, анализа и последующей визуализации исторических и современных топонимов (названий географических объектов).

Она использует структурированный подход, фокусируясь на пространственных, лингвистических и временных аспектах.

База данных (по состоянию на 24 апреля 2025 года) включает в себя 5 взаимосвязанных таблиц:

1. **spatial** - географические точки и метаданные.
2. **water** - неточечные географические объекты, такие как реки, ручьи и озера.
3. **linguistic** - аттестованные топонимы, их варианты и лингвистические атрибуты, такие как произношение и этимология.
4. **temporal** - временные периоды использования топонимов, подтвержденные по историческим источникам.
5. **sources** - метаданные о картах, книгах и прочих документах, содержащих информацию о топонимах.

---

## **1. spatial**

### **Назначение**
Хранит информацию о географических объектах, их официальное название, координаты и прочие метаданные.

### **Столбцы:**
- **`ID`** *(int, PK)*: Уникальный идентификатор для каждого географического объекта. Изначально геообъекты следовали в алфавитном порядке, основанном на книге Дубанова И. С. «Топонимический словарь Чувашии. Географические названия и термины» (2023_jun_14_dubanov_toponymy), сейчас ID присваиваются инкрементально.
- **`LAT`, `LON`** *(float, nullable)*: Точные или приблизительные географические координаты, полученные по современным и историческим картам (см. http://www.etomesto.ru/ , https://retromap.ru/ и другие ресурсы).
- **`OFFNAME`** *(string)*: Наиболее «официальное» название геообъекта (современное или историческое). Как правило (но не всегда), это русское название, взятое из наиболее позднего доступного источника.
- **`LANG`** *(string)*: Язык названия. Используемые коды: `RUS`, `CHU` (чувашский), `HIM` (горномарийский), `MEM` (луговомарийский), `ERZ` (эрзянский), `TAT` (татарский), `UNK` (неизвестен).
- **`CLASS`** *(string, nullable)*: Топонимическая категория, например, ойконим (название населенного пункта), гидроним (название водного объекта), дромоним (название дороги) и т. д.
- **`TYPE`** *(string, nullable)*: Топонимическая подкатегория, например, деревня или город (для ойконимов), река или ручей (для гидронимов) и т. д.
- **`DISTRICT`** *(string, nullable)*: Современный административный район (например, для различения деревень с одинаковым названием, расположенных в разных районах Чувашии).
- **`DOUBT`** *(int, nullable)*: Уровень достоверности присвоенных координат (пусто = «Я уверен», 1 = «Геопозиция под сомнением»).
- **`LANDMARK`** *(text, nullable)*: Имеет значение для микротопонимов; в этой графе могут быть указаны близлежащие ориентиры, помогающие определить местоположение объекта.
- **`COMMENTS`** *(text, nullable)*: Комментарии в свободном стиле.
- **`OTHER`** *(text, nullable)*: Зарезервировано для использования в будущем.

---

## **2. water**

### **Назначение**
Хранит информацию о реках, ручьях, озерах и других водных объектах.

### **Столбцы:**
- **`ID`** *(int, PK)*: Уникальный идентификатор для каждого водного объекта.
- **`SPATID`** *(int, FK → spatial.ID)*: Ссылка на запись в таблице spatial, связь водного объекта с прочими метаданными об объекте. Примечание: вообще, конечно, стоило бы хранить информацию о координатах водных объектов в spatial. К сожалению, основная работа ведется в табличных процессорах типа Google Sheets и Microsoft Excel, а они не могут обрабатывать информацию о координатах длинных рек, из-за технических ограничений ("Total number of characters that a cell can contain: 32,767 characters").
- **`SPATNAME`** *(string)*: Название водного объекта. TODO: в будущем изменить формат на **`SPATID`, `SPATNAME`** *(Composite FK → spatial (ID, OFFNAME))*
- **`WATERTYPE`** *(string)*: Тип водного объекта: river (река), stream (ручей) и т. п.
- **`WATERCOORD`** *(text)*: Смотри описание [MULTILINESTRING](https://datatracker.ietf.org/doc/html/rfc7946#section-3.1.5)

---

## **3. linguistic**

### **Назначение**
Хранит информацию о засвидетельствованных топонимах, главную форму и варианты, язык топонима, этимологию и прочие лингвистические метаданные.

### **Колонки:**
- **`ID`** *(int, PK)*: Уникальный идентификатор для каждого топонима. На всякий случай: это уникальный идентификатор именно для названия географического объекта, не для самого объекта, поэтому **ID** в этой графе не совпадают с **ID** в таблице **spatial**.
- **`SPATID`** *(int, FK → spatial.ID)*: Ссылка на запись в таблице spatial, связь топонима с обозначаемым геообъектом.
- **`DOUSPAT`** *(int, nullable)*: Уровень достоверности связи топонима и геообъекта (пусто = «Я уверен», 1 = «Связь с геообъектом под сомнением»).
- **`MAINID`** *(int, FK → linguistic.ID)*: Указывает на главный топоним в кластере названий одного и того же геообъекта (группировка необходима для облегчения заполнения таблицы; также многие исторические источники часто дают несколько каким-то образом связанных имен для одного пространственного объекта, и мы хотим отражать эти связи в базе данных).
- **`TOPONYM`** *(string)*: Форма топонима, зафиксированная в наиболее позднем или наиболее авторитетном источнике.
- **`TOPFORMS`** *(text, nullable)*: Список вариантов топонима, зафиксированных в более ранних или менее авторитетных источниках (это поле должно содержать названия **на том же языке**, что и поле **TOPONYM**). Что считать вариантом названия геообъекта, а что считать отдельным названием, конечно, сложный вопрос, но в общем случае на него помогает ответить лингвистическая направленность нашей топонимической базы -- если вы считаете, что у двух названий может быть разная этимология, то это два разных топонима и они заслуживают отдельных строк в таблице.
- **`DOUTOPO`** *(int, nullable)*: Уровень достоверности формы в поле `TOPONYM` (пусто = «Я уверен», 1 = «Форма под сомнением»).
- **`LANG`** *(string)*: Язык топонима, в соответствии с предопределенными кодами.
- **`DOULANG`** *(int, nullable)*: Уровень достоверности языка топонима (пусто = «Я уверен», 1 = «Язык под сомнением»).
- **`PRONUNC`** *(string)*: Зарезервировано для данных о произношении (формат TBD).
- **`DOUPRON`** *(int, nullable)*: Достоверность данных о произношении (пусто = «Я уверен», 1 = «Произношение под сомнением»).
- **`ETYM`** *(text, nullable)*: Этимология топонима (это всегда реконструкция, поэтому ее следует рассматривать с некоторой долей сомнения).
- **`ORIGIN`** *(string, nullable)*: Язык происхождения топонима, например, `CHU`, `HIM`, `MEM`, `RUS`, `TAT`, `OTH`, `UNK` (и это тоже всегда реконструкция).
- **`COMMENTS`** *(text, nullable)*: Комментарии в свободном стиле.
- **`OTHER`** *(text, nullable)*: Зарезервировано для использования в будущем.

---

## **4. temporal**

### **Назначение**
Хранит информацию о подтвержденных фактах упоминания топонимов в доступных источниках с указанием временных периодов.

Внимание: эта таблица связана с тикетами в репозитории, см. [список тикетов](https://sjyrmi.ru/myfossil/chu_toponymy_1/rptview/1)

### **Столбцы:**
- **`ID`** *(int, PK)*: Уникальный идентификатор для каждого исторического факта упоминания топонима.
- **`LINGID`, `LINGNAME`** *(Composite FK → linguistic (ID, TOPONYM))*: Ссылка на запись в таблице **linguistics**.
- **`NESTID`** *(int, FK → temporal.ID)*: Используется для группировки как-либо связанных (во времени и не только) топонимов (например, русское название и его чувашская пара или несколько названий основной деревни на разных языках и названия поселений, которые впоследствии были включены в состав главной деревни, также на разных языках, и т. д.). Обычно это ссылка на самое современное название главного из нескольких геообъектов на русском языке.
- **`STARTYEAR`** *(int)*: Самая ранняя фиксация топонима (год первого упоминания по какому-либо источнику: книге, карте и т. п.), полный текст источника или ссылка на тикет приводится в поле `FULLTEXT`.
- **`DOUSTART`** *(int, nullable)*: Достоверность самого раннего упоминания (пусто = «Я уверен», 1 = «Упоминание сомнительно»).
- **`ENDYEAR`** *(int, nullable)*: Самая поздняя фиксация топонима (год последнего упоминания по какому-либо источнику: книге, карте и т. п.), полный текст источника или ссылка на тикет приводится в поле `FULLTEXT`. Если топоним продолжает употребляться (например, село не исчезло и присутствует на картах), то это поле следует оставить пустым.
- **`DOUEND`** *(int, nullable)*: Достоверность самого позднего упоминания (пусто = «Я уверен», 1 = «Упоминание сомнительно»).
- **`COMMENTS`** *(text, nullable)*: Комментарии в свободном стиле.
- **`OTHER`** *(text, nullable)*: Зарезервировано для использования в будущем.
- **`FULLTEXT`** *(text)*: Полный текст упоминания топонима в историческом источнике или ссылка на тикет в репозитории, где приведены такие тексты и ссылки на источники (карты, книги и пр.).

## **Правила заполнения и комментарии:**
- Лучше всего заполнять не по порядку следования ID в таблицах, а по районам (начиная с Ядринского, заканчивая Шемуршинским). TODO: добавить ссылку на карту районов Чувашии.
- Выбираем село, выбираем стартовый ойконим, подходящий для использования в качестве NESTID.
- Заводим тикет с заголовком типа "NESTID <number> <toponym>", например, "NESTID 68 Мурзакасы".
- создаем временный лист в MS Excel или Google Sheets.
- для стартового ойконима заполняем таблицу следующего вида
```
| # | Name                  | Year   | Link URL                                                 |
|---|-----------------------|--------|----------------------------------------------------------|
| 1 | Toponym_Form_1        | Year_1 | [Source_Name_1](Source_Link_1)                           |
| 2 | Toponym_Form_2        | Year_2 | [Source_Name_2](Source_Link_2)                           |
```
проходя по основным источникам из sources, от наиболее позднего к наиболее раннему.
Карты удобно смотреть на [etomesto.ru](http://www.etomesto.ru/). Книги же желательно скачать с [архива проекта](https://disk.yandex.ru/client/disk/%D0%A2%D0%BE%D0%BF%D0%BE%D0%BD%D0%B8%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F%20%D0%BB%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%B0), особенно S001 и S008.
Интуиция, какие источники для какого района полезны, наработается быстро.
- В процессе заполнения таблицы для стартового ойконима может возникнуть нужда начать собирать информацию для связанных топонимов, на старых картах может обнаружиться много новых названий. Лучше всего делать это сразу же, по порядку работы с источниками, от наиболее позднего к наиболее раннему -- таким образом когнитивная сложность будет минимальной.
Для иллюстрации относительно сложного случая, можно, например привести [NESTID 54 Буртасы](https://sjyrmi.ru/myfossil/chu_toponymy_1/tktview/187c04eeae)
- В случае хоть сколько-нибудь сложных событий типа "Деревня Буртасы была образована 23 апреля 1964 из трёх деревень: Толды Буртасы, Шалды Буртасы, Сурнары" каждый упомянутый топоним достоин отдельной строки типа
```
| N | Toponym_N        | Year_N | [Source_Name_N](Source_Link_N)                           |
```
Обратите внимание на таблицы в последнем комментарии к тикету [NESTID 54 Буртасы](https://sjyrmi.ru/myfossil/chu_toponymy_1/tktview/187c04eeae), там это правило нарушено (из-за того, что таблицы были составлены по географическому признаку) и отдельные строки есть только для 3 топонимов из 4 упомянутых. Такая экономия приводит к ошибкам, будьте осторожнее, последний год употребления топонима "Толды-Буртасы" не 1954, а 1964, а из таблицы это не очевидно.
- После того, как таблица заполнена для всего гнезда топонимов, ее полезно перевести в формат MarkDown, например, с помощью сервиса [Markdown tables generator](https://www.tablesgenerator.com/markdown_tables#)
- После того, как MarkDown-таблица будет готова, ее надо внести в комментарии к текущему рабочему тикету, для этого в интерфейсе Fossil есть кнопка Edit. Менять при этом какие-то поля кроме "Append Remark with format MarkDown" не стоит, просто копипастим текст таблицы в самое большое поле в интерфейсе, затем Preview, затем Submit.
- После этого для всего гнезда топонимов следует заполнить ячейки таблицы temporal, вся информация для этого уже собрана.
- После окончания работы над temporal надо удостовериться, что каждый внесенный в temporal топоним имеет связанное упоминание в linguistics. Для многих старых названий это очевидно потребует внесения новых строк в linguistics и создания новых межтабличных связей через соответствующие ID. Названия из старых источников мы даем в орфографии этих источников, мы не осовремениваем орфографию (по сути, это бессознательный перевод с одного языка на другой).
- Для орфографических и прочих вариантов топонимов, довольно часто возникающих при работе с историческими источниками, надо определиться, какой из вариантов топонима мы считаем основным, а все прочие надо внести в поле **TOPFORMS**.
- После окончания работы над linguistics надо удостовериться, что каждый внесенный в linguistics топоним имеет связь с геообъектом в spatial. Опять же, это может потребовать внесения новых строк в spatial и создания еще нескольких межтабличных связей через соответствующие ID. По возможности, координаты мы вводим точно и по новым картам, например, по [Яндекс.Картам](https://yandex.ru/maps).
- Как правило, для чувашского названия, парного к русскому, стоит указывать те же годы упоминаний, что и для русского. Для того же, чтобы отразить чуть большую степень "сомнительности" этой реконструированной информации, стоит ставить "1" в поле **DOUSTART**.
- В самом конце работы над гнездом топонимов надо вбить ссылку на тикет в поле **FULLTEXT**.
- После этого можно перейти к названиям следующего объекта, в идеале, одного из расположенных поблизости.

---

## **5. sources**

### **Назначение**
Хранит информацию о библиографических или архивных источниках, используемых для работы с таблицей **temporal**.

### **Столбцы:**
- **`ID`** *(строка, PK)*: Уникальный идентификатор.
- **`TYPE`** *(строка)*: Тип источника (`BOOK`, `ARTICLE`, `MAP`, `ARCHIVE`, `WEB`).
- **`TITLE`** *(text)*: Краткое неформальное название источника (название книги, название статьи, название карты и т. д.).
- **`YEAR`** *(int, nullable)*: Год публикации или создания.
- **`CITATION`** *(text, nullable)*: Полная библиографическая ссылка.
- **`URL`** *(text, nullable)*: Веб-ссылка на источник (если имеется).
- **`DIGCOPY`** *(string, nullable)*: Хранится ли цифровая копия в [архиве проекта](https://disk.yandex.ru/client/disk/%D0%A2%D0%BE%D0%BF%D0%BE%D0%BD%D0%B8%D0%BC%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%B0%D1%8F%20%D0%BB%D0%B8%D1%82%D0%B5%D1%80%D0%B0%D1%82%D1%83%D1%80%D0%B0)? (`yes` или `no`).
- **`COMMENTS`** *(текст, nullable)*: Комментарии в свободном стиле.
- **`OTHER`** *(text, nullable)*: Зарезервировано для использования в будущем.

### **Использование и связь с таблицей temporal**
Каждая запись в таблице **temporal** должна либо напрямую ссылаться на один или несколько источников из таблицы sources, либо ссылаться на тикет, в котором упомянуты источники.

---

## **Ссылки и связи между таблицами:**
- ** `SPATID` (water) -> `ID` (spatial)**: Связывает названия и координаты водных геообъектов с прочими их метаданными
- ** `SPATID` (linguistic) -> `ID` (spatial)**: Связывает топонимы с координатами обозначаемых геообъектов и прочими метаданными геообъектов
- **`LINGID`, `LINGNAME` (temporal) -> `ID`, `TOPONYM` (linguistic)**: Связывает факты упоминания топонимов в источниках и метаданные топонимов (координаты обозначаемого геообъекта, язык, этимология и т. д.)

---

## **Следующие шаги**
- Доработать формат поля `PRONUNC`.
- Определить соглашения для заполнения полей `DOUBT`.

---

## **Конвенция комментирования**
Все поля комментариев должны иметь единый формат. Автор добавляет свои инициалы (по фамилии, имени, отчеству), затем двоеточие и пробел. Если вы развиваете чужой комментарий, разделяйте записи с помощью ` | ` (пробел-пробел-пробел).

Пример: 
```
SMY: в 27 км от райцентра, в лесах на правом берегу Суры, ныне не существует | IRI: На карте 1985 г. с retromap.ru это кордон Келейный, через реку от урочища Монашеское с более современных карт, примерно в месте впадения р. Чернушки в р. Бездну
```