172 похожих чатов

Коллеги, подскажите по архитектуре. Сервис, аналог яндекс.диска или гугл.драйв, но

не по хранению файлов, а просто данные компаний (всякая отчетность и тд).

Но структура подобная: есть у пользователя на компьютере приложение со своей sql-базой, данные из локальной базы должна синхронизироваться с облачной (постгрес) и некоторые действия, предоставлять иногда доступ к своим данным другим пользователям.

Пользователей предполагается много, порядка 1млн. Вообще меньше, но запас поставили такой.

Как лучше спроектировать постгрес? Варианты:
1. Сливаем все данные в одну схему в таблицы по сущностям: например: table_users, table_orders и т.д. И секционируем эти огромные таблицы по дате, а внутри секционируем по пользователям.
2. Каждого пользователя заливаем в отдельную schema, у каждого будет своя синхронизация локальной базы со своей schema. И в отдельной schema сделать возможность общего доступа к данным. Типа schema это как место на яндекс.диске. У каждого пользователя своя.

Вот как будет логичней архитектуру создать?

19 ответов

21 просмотр

Прекратите выдумывать оптимизацыи -- с вашым опытом у вас не получается. Никаких партицыонирований, разных схем, составных строк и документов в jsonах -- только классические значения, классические отношэния между таблицами и простые смыслы у всего. Когда потребуется -- тогда и будете делать, притом, 100% -- совсем не то, что собрались сейчас.

Danila- Автор вопроса
Ilya Anfimov
Прекратите выдумывать оптимизацыи -- с вашым опыто...

Хорошо, можете пояснить чем плохи мои решения?

Danila
Хорошо, можете пояснить чем плохи мои решения?

Да много чего вы предложыли. Таблицы не в 1НФ, DDL в обычной работе, миллионы схем (ладно, десятки тысяч), партицыонирование без показаний (оно тут непростое, потому это всегда слёзы, и чаще всего -- торможэние).

Danila- Автор вопроса
Ilya Anfimov
Да много чего вы предложыли. Таблицы не в 1НФ, DDL...

Почему? Все таблицы в НФ. Я просто думаю как логически это все увязать. Если пользователь просто синхронизирует свои данные с облаком (постгрес), то зачем бегать по таблице всех пользователей, когда можно обратиться в свою схему. Тем более, что количество схем не ограничено в постгресе. Ну или разбить на партиции. Я понимаю, что партиции сложны, но архитертуру хотелось бы продумать заранее, хотя бы селать ее гибче

Danila
Почему? Все таблицы в НФ. Я просто думаю как логи...

Колонка типа "iduser.idaction" -- очень типичное нарушэние 1НФ. Главное, в данном случае -- безо всякой пользы. И да, суть в том, что вашы оцэнки того, что "полезно" или "быстро" -- пока что крайне далеки от реальности. Ну, вот не знаю -- опыта нехватает или там божэственного откровения -- но вот все эти рассуждения "зачем бегать по таблице всех пользователей", " селать ее гибче" -- являются полной ерундой.

Danila- Автор вопроса
Ilya Anfimov
Колонка типа "iduser.idaction" -- очень типичное н...

а как бы вы спроектировали архитектуру для этой задачи (про синхронизацию)? поделитесь мыслями

Danila
а как бы вы спроектировали архитектуру для этой за...

1) Для начала -- есть шанс, что дажэ не взялся бы. Это, фактически, мульти-мастер, а мульи-мастер для взаимосвязанных данных -- это всегда боль, разрешэние конфликтов, привлечение экспертов для этого разрешэния и необходимость в тренировке пользователей. В общем, ... мало там не покажэтся, я думаю. 2) А сама репликацыя -- хранил бы с каждой строчкой changetime, плюс отметки в базах о последней успешной синхронизацыи. Всё, что появилось с последней успешной синхронизацыи -- отправляется на сервер и получается оттуда. Последний изменившый побеждает, если нет каких-то важных конфликтов (например, если эту строчку не хочется потерять, а изменили её в двух местах). И да, примерно всё остальное -- чётко по предметной области.

Danila
а как бы вы спроектировали архитектуру для этой за...

В соответствии с техническим заданием. Которого ты нам не показал. Ну, конечно, яндексе диски же все знают как делать..

Danila- Автор вопроса
Ilya Anfimov
1) Для начала -- есть шанс, что дажэ не взялся бы....

Благодарю, есть над чем подумать. Можете подкинуть какие-нибудь ресурсы на эту тему с кейсами или бестпрактис?

Ilya Anfimov
1) Для начала -- есть шанс, что дажэ не взялся бы....

> Всё, что появилось с последней успешной синхронизацыи -- отправляется на сервер и получается оттуда. Вот это прямо напоминает "Любая, даже самая сложная, проблема обязательно имеет простое, лёгкое для понимания, неправильное решение." ;) Я, к несчастью, видел несколько систем "репликации", сделанных по этому принципу. Естественно, все они работали неправильно (теряли данные). Если что — их проблема в том, что реальное время не имеет никакого отношения к "видимому" порядку выполнения транзакций. Т.е. строка с меньшим changetime вполне может появиться в базе позже (в реальном времени), чем строки с большим. Разумеется, подобные системы "теряют" такие строки.

Yaroslav Schekin
> Всё, что появилось с последней успешной синхрони...

Чтобы этого не было -- надо, конечно, блокировать отметку синхронизацыи, чтобы сам процэсс видел консистентные данные и никто не мог в ведомую базу ничего записать пока синхронизацыя не завершытся. И да, Вы, скорее всего, видели множэство автоматических онлайн мульти-мастеров, которых делали чтобы было прозрано для "пользователя" и нагрузка распределялась. У этих-то вообще мало шансов быть нормальными. Если бы задача стояла так -- то я бы посоветовал вообще оставить надежду. Синхронизацыя пользовательских данных при участии пользователя, с другой стороны -- в общем реальна. Вон, git тому примером. Только, понятно, тяжко там всё.

Ilya Anfimov
Чтобы этого не было -- надо, конечно, блокировать ...

> и никто не мог в ведомую базу ничего записать пока синхронизацыя не завершытся А это не поможет. Проблема-то в работе с источником данных. > И да, Вы, скорее всего, видели множэство автоматических онлайн мульти-мастеров Да если бы. Обычная однонаправленная "синхронизация". > Только, понятно, тяжко там всё. Готовые системы триггерной репликации (например, Slony) вполне справляются, тем не менее.

Yaroslav Schekin
> и никто не мог в ведомую базу ничего записать по...

>А это не поможет. Проблема-то в работе с источником данных. Поможэт. Ну, то есть консистентность состояния всё равно будет необходимо выправлять бизнес-логикой -- поскольку параллельные изменения могут всё рушыть и без каких-либо проблем с таймстампами. >например, Slony Например, слони однонаправленный -- и это совсем другое дело. Почитать слони, кстати, я бы топикстартеру советовал -- хорошо работающая архитектура и написана относительно несложно. Но напрямую копирование его архитектуры в этом кейсе по многим причинам не подойдёт.

Ilya Anfimov
>А это не поможет. Проблема-то в работе с источник...

почему "Слони"? "Слоны" же, вроде Бартунов с Сигаевым запустили в начале нулевых тему.

Ega23 Egorov
почему "Слони"? "Слоны" же, вроде Бартунов с Сигае...

Не знаю, не видел тех заявлений Сигаева с Бартуновым.

Ilya Anfimov
Не знаю, не видел тех заявлений Сигаева с Бартунов...

Ян Вик, автор Слонов, рассказывал, что это именно Слоны.

Ilya Anfimov
>А это не поможет. Проблема-то в работе с источник...

> Поможэт. Наверное, авторы этих систем синхронизации тоже так думали... но не помогло. ;) > Например, слони однонаправленный А я всего лишь про такой случай и писал, собственно. И уже там можно запросто "накосить", используя "простые и очевидные" подходы.

Похожие вопросы

Обсуждают сегодня

30500 за редактор? )
Владимир
47
а через ESC-код ?
Alexey Kulakov
29
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
14
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
Ребят в СИ можно реализовать ООП?
Николай
33
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_h_common.erl#L174 https://github.com/erlang/otp/blob/OTP-27.1/lib/kernel/src/logger_olp.erl#L76 15 лет назад...
Maksim Lapshin
20
~ 2m21s  nix shell github:nixos/nixpkgs#stack ~  stack ghc -- --version error: … while calling the 'derivationStrict' builtin at /builtin/derivation.nix:...
Rebuild your mind.
6
Карта сайта