|
2 | 2 | [](https://github.com/emptybutton/tgdb/actions?query=workflow%3ACI) |
3 | 3 | [](https://github.com/emptybutton/tgdb/actions/workflows/cd.yaml) |
4 | 4 | [](https://github.com/emptybutton/tgdb/releases) |
5 | | -[](https://github.com/search?q=repo%3Aemptybutton%2tgdb+language%3APython+&type=code) |
6 | 5 | [](https://wakatime.com/badge/user/0d3b7ff5-0547-4323-a43e-2a7308d973a0/project/2e316b92-fcf1-44d8-ad77-6c81e23cdfe2) |
| 6 | +[](https://github.com/search?q=repo%3Aemptybutton%2tgdb+language%3APython+&type=code) |
| 7 | +[](https://codecov.io/gh/emptybutton/tgdb) |
7 | 8 |
|
8 | 9 | РСУБД поверх Telegram. |
9 | 10 |
|
10 | 11 | ```bash |
11 | 12 | pip install tgdb |
12 | 13 | ``` |
| 14 | + |
| 15 | +```bash |
| 16 | +docker pull n255/tgdb:0.1.0-slim |
| 17 | +``` |
| 18 | + |
| 19 | +> [!CAUTION] |
| 20 | +> **Не используйте этот проект с большим количеством ботов**, так как он нарушает правила Telegram-а и ухудшает его работоспособность из-за создания паразитической нагрузки. |
| 21 | +> |
| 22 | +> В противном случае ваши данные могут быть удалены, а аккаунты забанены. |
| 23 | +
|
| 24 | +## Overview |
| 25 | +`tgdb` - это СУБД хранящая данные в чатах телеграмма и предоставляющая доступ к ним в виде реляционной модели и ACID транзакций. |
| 26 | + |
| 27 | +Всё взаимодействие с Telegram происходит через ботов/юзерботов, которые имеют фиксированные [лимиты](https://limits.tginfo.me/en) для отправки запросов в некотором промежутке времени и фактически являюстя арендой очень маленького кусочка инфраструктуры Telegram-а. |
| 28 | + |
| 29 | +Из-за специфичных лимитов, операции над сообщениями имеют слишком разную цену, чем у операций, которыми можно обращатся с памятью или дисковым пространством, что требует альтернативных решений даже над простыми вещами, которые имеют устоявшиеся подходы: |
| 30 | +- Все операции можно выполнять за константное время (обычно от 200мс до 400мс), но чтение гораздо дороже операций записи, из-за того что читать сообщения могут только юзерботы. |
| 31 | +Для регистрации юзерботов нужен отдельный номер (а по закону РФ одно физ. лицо может иметь только 20 номеров любых провайдеров), когда для обычных ботов нужно только регестрация у BotFather. |
| 32 | +- Несмотря на сложность создания юзерботов, можно читать сразу много сообщений за одно обращение, а писать новые сообщения можно только по обращению на каждое новое сообщение. |
| 33 | +Обновления само по себе является записью, но для него первоначально необходимо найти то сообщение, которое нужно обновить. |
| 34 | +Удалять можно сразу много сообщений, которых также необходимо найти, но в отличии от обновления, удалять можно сразу много сообщений за одно обращение. |
| 35 | + |
| 36 | +## Операции |
| 37 | +На данный момент можно читать кортежи только до записи, а сама запись возможна только одним bulk запросом вместе с коммитом. В дальнейшем возможно сделать выполнение операторов таким же, как в обычных СУБД, но пока это не сделано. |
| 38 | + |
| 39 | +`tgdb` не использует MVCC, поэтому невозможно сделать Repeatable Read в том виде, что бы он был легче Serializable, поэтому может быть только три уровня изоляции: |
| 40 | + |
| 41 | +> `n` - количество транзакций этого уровня изоляции. |
| 42 | +
|
| 43 | +<table> |
| 44 | + <tr> |
| 45 | + <th>Уровень изоляции</th> |
| 46 | + <th>Особенности</th> |
| 47 | + <th>Скорость старта</th> |
| 48 | + <th>Скорость коммита</th> |
| 49 | + <th>Скорость роллбека</th> |
| 50 | + <th>Память</th> |
| 51 | + <th>Главный Bottle Neck</th> |
| 52 | + </tr> |
| 53 | + <tr> |
| 54 | + <td><b>Serializable</b></td> |
| 55 | + <td>В лучшем случае позволяют избежать любых аномалий. Нужно ретраить транзакции по ошибке сериализуемости</td> |
| 56 | + <td>O(n)</td> |
| 57 | + <td>O(n)</td> |
| 58 | + <td>O(n)</td> |
| 59 | + <td>O(n^2)</td> |
| 60 | + <td>CPU и память</td> |
| 61 | + </tr> |
| 62 | + <tr> |
| 63 | + <td><b>Read Сommited</b></td> |
| 64 | + <td>Пока не существует. Транзакции могут видеть только зафиксированные данные. Любые операции чтения могут выполнятся в 3 раза дольше</td> |
| 65 | + <td>O(1)</td> |
| 66 | + <td>O(1)</td> |
| 67 | + <td>O(1)</td> |
| 68 | + <td>O(n)</td> |
| 69 | + <td>IO</td> |
| 70 | + </tr> |
| 71 | + <tr> |
| 72 | + <td><b>Read Uncommited</b></td> |
| 73 | + <td>Транзакции могут видеть не зафиксированные изменения других транзакций</td> |
| 74 | + <td>O(1)</td> |
| 75 | + <td>O(1)</td> |
| 76 | + <td>O(1)</td> |
| 77 | + <td>O(n)</td> |
| 78 | + <td>IO</td> |
| 79 | + </tr> |
| 80 | +</table> |
| 81 | + |
| 82 | +> [!IMPORTANT] |
| 83 | +> Если паралельно выполняются несколько транзакций с разным уровнем изоляции, то у всей группы будут гарантии минимального уровня изоляции. |
0 commit comments