Николай Ланец
17 дек. 2019 г., 23:46

Работа сайта prisma-cms.com восстановлена

Всем привет!

На протяжении двух недель, если вдруг кто-то пытался зарегистрироваться/авторизоваться, или будучи уже авторизованным написать комментарий или типа того, то получал сообщение типа "Извините, ведутся технические работы. Может быть заработает завтра".

На счет "завтра" - слишком уж не определенно, но на то были причины. Дело в том, что было произведено полное обновление призмы (которая суть сторонняя технология, а не моя prisma-cms, работающая с ее использованием). Обновление было выполнено до версии 1.34, в то время как до этого использовалась 1.15, которая вышла еще в августе прошлого года. Так долго я просидел на старой версии, потому что там появились изменения, которые нарушали работу уже действующих проектов. Но в итоге все-таки решил обновиться, потому что новые фишки перекрывали трудозатраты на обновление действующих проектов. И главная фишка - они убрали лишние промежуточные таблицы для связей один-к-одному и один-ко-многим (многие-ко-многим по прежнему через доптаблицы, но это уже распространенная практика). Я не буду вдаваться в технические тонкости, но скажу только, что это очень круто и оно того стоило. В итоге количество таблиц сократилось в 2-3 раза. Конкретно на этом проекте их количество сократилось с 202 до 74. А это и снижение нагрузки, и упрощение составления SQL-запросов и т.п.

Но что касается такого долгого простоя, уже после обновления было замечено, что связь Топик-Комментарии организована неправильно, в результате чего не Комментарий ссылался на Топик, а Топик на Комментарий, при чем конечно же максимум 1:1. А так как база переносилась экспортом на чистую новую, то пришлось отключить всякие изменения на сайте, чтобы не появились в дальнейшем конфликты.

В общем, сегодня эта проблема решена и сайт восстановил работу. До этого просто был очень занят.
Была версия, что это происки Рамблера:)
А за счет чего уменьшилось количество таблиц?
За счет отказа от промежуточных таблиц для связей.
К примеру, Есть Топик, и у него есть свойство КемНаписан (Пользователь). В классической реляционной модели мы в таблице Топика просто добавляли колонку типа user_id, которая ссылалась на таблицу Пользователя через его id. Попутно могли настроить первичные/вторичные ключи, чтобы обеспечить целостность данных.
В итоге у нас было по прежнему две таблицы (Топики и Пользователи). В свою очередь через эту связь мы могли получить Пользователя по Топику, и по Пользователю
получить все его Топики.

В ранних версиях призмы эта связь обеспечивалась не через колонку в Топике, а через промежуточную таблицу ПользовательТопик. Таким образом связь выглядела так: Пользователь - ПользовательТопик - Топик.
Это обеспечивало все варианты связей (один-к-одному, один-ко-многим и многие-ко-многим). Но, это все-таки лишняя таблица, с кучей соответствующих минусов (включая усложнение написания SQL-запросов, в том числе и потому что колонки в таких таблицах имели "интуитивнопонятные" названия типа A и B).
Вот так вот этот ад выглядел: http://joxi.ru/brReEnMhYJ1VkA
А это только часть таких таблиц: http://joxi.ru/a2XWaY6ID1dZWm (имена таблиц связей начинаются с подчеркивания).

Сейчас подобных таблиц осталось всего 13 штук.

В принципе, на сами GraphQL-запросы это почти не повлияло (в плане их написания). То есть если мы раньше писали запрос
query { users ( first: 3 ){ id username Resources ( first: 3 ){ id name } } }
то есть получали список пользователей и их публикации, то оно так и осталось. Просто под капотом на уровне самой призмы работа поменялась. Поэтому, если делать совсем не большой сервис, то это можно было и не брать во внимание. Но когда делаешь что-то побольше, да еще и начинаешь чистые SQL-запросы писать, то новая призма конечно же гораздо лучше себя показывает.

Сегодня опять перебои в работе были. Перенес окончательно prisma-cms.com в докер.

Добавить комментарий