Снято живьём 2026-07-24 через devopsmcp db_schema. 187 таблиц
в public (включая легаси-мусор от Metabase/Quartz в той же БД) — ниже
только таблицы, участвующие в антифрод-детекторах.
Связи ключевых таблиц
Стрелка = внешний ключ, подпись — колонка-источник. Limits хранит владельца в одном из трёх полей
(CardId / CardGroupId / CompanyId) — на диаграмме показаны связи с Cards и Companies.
FinanceTransaction
4 865 144 строк, 2.3 GB. Ядро схемы: одна строка = одна заправка/операция.
Колонка
Тип
Примечание
Id
int PK
CardId
int FK→Cards
индекс есть
CompanyId
int FK→Companies
клиент; индекс есть
CardOwnerId
int FK→CardOwners
водитель; индекс есть
GasStationId
int FK→GasStations
индекс есть
FuelTypeId
int FK→FuelTypes
nullable
FuelVinkTypeId
int FK→FuelTypeVink
тип топлива в кодах ВИНК
CreateTime
timestamp (naive, локальное)
индекса нет (только композитные CompanyUserId+CreateTime, SecondCompanyUserId+CreateTime)
Внимание:CardId в этой таблице нет —
лимиты водителей привязаны через CardOwnerId; дневные/недельные/месячные значения
хранятся в полях InDay/InWeek/InMonth
(детекторы: каталог).
GasStations — 389 262 строк
Колонка(и)
Примечание
Title
RegionId
FK→Region, NOT NULL — текстового поля Region нет
CoordsX / CoordsY
text
VinkName
CardType
GasStationBrandId
FK→GasStationBrands — поля Brand нет
ProviderCompanyId
Status
Adress
Region
Колонка(и)
Примечание
Title
TimzeZone
int (sic — опечатка в самой схеме)
Code
PartRegionTitle
Companies — 3 683 строк
Колонка(и)
Примечание
Title, JurudicalTitle, Inn
IsBlocked
VinkType
CardTypes
text
IsBrandCompany
AccessToDirectContracts / Resale / FuelUsing
CompanySettingsId
Договорная модель
Таблицы Contracts нет — договор оформлен как
DirectContracts + ContractTerms(+Templates).
835K — лимиты как их видит кабинет ВИНК (для сверки mirror-divergence)
ApiCardInfos
171K — карты по данным ВИНК
LimitVinkHistory
480K — история изменений лимитов в ВИНК
RestrictionLimitStates
378K — состояния ограничений
CardLogs
7.75M
CardChangeLogs
271K — только Id, CompanyOwnerId, CompanyUserId, CardId, LastModifed; тип и значения изменения не сохраняются
FinanceTransactionParts
11.2M — части транзакций (12 колонок)
FinanceTransactionDiscountHistories
2.1M
DeletedFinanceTransactionForReports
67
Критичные факты для антифрода
Нет индекса по FinanceTransaction.CreateTime — любой «за последние N дней» = seq scan 2.3 GB. Сервису нужен либо индекс (btree CreateTime или BRIN), либо инкрементальная выгрузка по Id.
CreateTime naive-локальное, CreateTimeUtc частично '0001-01-01' — все временные проверки обязаны фиксировать таймзону; NOW() на сервере БД ≠ время транзакции. Регион АЗС имеет TimzeZone — ночь надо считать в локальном времени АЗС.
Координаты АЗС — text (CoordsX/CoordsY), нужен CAST + фильтр мусора; PostGIS не предполагается — haversine на float.
Таблицы Contracts нет — договорная модель: DirectContracts + ContractTerms(+Templates).
Полная история изменений лимитов внутри БД не сохраняется — детекторы опираются на LimitVinkHistory/ApiLimitInfo (зеркало ВИНК) и на LastModifed текущих записей.
Прод пережил реальные инциденты класса «порча лимитов»: zero-limit flood 2026-07-01 (ГПН+Татнефть, ~18K тасков), Лайт Скай limit-wipe 2026-06-23, фантом категории-0 Роснефть (A-1353). Детекторы массовых изменений лимитов (D-14) — не теория.
Снято живьём через devopsmcp db_schema 2026-07-24, 187 таблиц в public. Детекторы, использующие эти таблицы — на странице «Детекторы».