• Как правильно организовать связь между сервисами смешанного типа и оповещать пользователя о завершении процесса?

    REST синхронный, очередь сообщений асинхронная. Если переходите на асинхроту, для HTTP придётся WebSocket внедрить, или long-poll, или костыльно poll'ить раз в секунду, например. (Фу!)
    Задачи идентифицировать, чтобы несколько запросивших одно, получили единственное.
    Посмотрите паттерн Pub-Sub. Например, отправивший задание "хочу данные X в формате Y" подписывался на сообщения канала "готовченко" и ждал в нём свой "X-Y".
    Планировать сообщения и события в асинхронной системе мне удобно в онлайн редакторе UML диаграмм. Сверху участники процессов. Вниз идёт "время". И взаимодействия, кто кому что отправил.
    Ответ написан
    Комментировать
  • Нормально ли хранить JSON в базе данных?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Был такой нудный дедушка Эдгар Кодд. Он как-то из соображений своей нудности взял и объявил что только он знает как правильно делать реляционные базы.

    Вобщем его первое правило касается атомарности данных которые лежат в ячейках таблицы. И если в рамках решаемой вами задачи JSON атомарен - то все в порядке и никакой проблемы нету. Храните себе JSON.

    Но если внутри JSON будет поле которое способно изменяться независимо от остальной части документа - то старичок Эдгар будет на вас сильно зол. Может даже вас побить.

    В наше время уже созданы специализированне БД (Mongo, CouchDb) которые плевали на нормализацию. Они расширяют и ослабляют понятия нормализации. Not-Only-SQL говорят про себя.
    Ответ написан
    Комментировать
  • В чем можно хранить около триллиона значений key=>value?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Давайте прикинем объем который понадобится. Что такое триллион?
    Это 12 нулей. Или 1 000 000 000 000 элементов. Какая у нас data-row?
    8 + 64 символов типа ASCII (байт подходит чтоб покрыть все символы).
    Итого 72 байта на строку. Там можно еще поужимать биты в байтах но только
    сложность повышает а большой пользы для дела не дает. Пускай будет ASCII == 1 байт.

    Вобщем такой расчет

    72000000000000 байтов на весь сегмент данных когда таблица загружена.
    Или 65 терабайт. А сколько магнитных блинов надо прикупить? Возьмем популярный магнитный
    Western Digital Purple 10TB 7200rpm 256MB WD102PURZ 3.5" SATA III при цене 290$
    Порядка 7 штук надо. Вобщем готовте котлету денег 290$ * 7 = 2030$

    По поводу DBMS. Да key-value здесь подходит. Можно начинать с LevelDb или RocksDb но у них
    расход дисковой памяти на 1 строчку может быть больше чем я посчитал. Я ведь считал эконом-эконом
    вариант в виде бинарного типизированного файла где все записи строго по 72 байта. Сколько именно
    захватит РоксДб или ЛевлДб - чорт его знает. Вряд-ли документация об этом что-то говорит.
    Но берите 1% датасета. Загружайте
    и аппроксимируйте сколько выйдет после полной прогрузкуи. Это - надежный способ оценки.
    Ответ написан
    12 комментариев
  • Зачем именно нужны связи в бд?

    @deliro
    Когда к тебе придёт менеджер и скажет: "эй, hrnsywtfczlh, а почему у нас тут вот заказов отгруженных на 15 миллионов, а получателей даже не в базе?", тогда-то ты и поймёшь, зачем нужны связи в БД. Но сперва поседеешь.
    Ответ написан
    7 комментариев
  • Как хранить публикации пользователя в бд?

    @apshur
    Для хранения публикаций, комментариев, ответов и других данных, связанных с конкретным пользователем, рекомендуется использовать реляционную базу данных.

    Для каждого типа данных, например для публикаций, создается отдельная таблица, содержащая поля, характеризующие соответствующие данные. Так, для хранения публикаций может быть создана таблица "publications" со следующими полями:

    - id - уникальный идентификатор публикации;
    - title - заголовок публикации;
    - text - текст публикации;
    - date - дата публикации;
    - user_id - идентификатор пользователя, который опубликовал данную запись.

    При добавлении новой публикации в базу данных необходимо указать id пользователя, чтобы можно было отобразить только те публикации, которые принадлежат данному пользователю. Таким образом, в базе данных можно хранить информацию о публикациях всех пользователей и отображать только те записи, которые принадлежат текущему пользователю.

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

    Важным моментом является связь между таблицами. Если у одного пользователя может быть несколько публикаций, то в таблице пользователей можно создать поле "id", которое связывается с полями "user_id" из таблиц публикаций, комментариев и ответов. Таким образом, можно легко связывать отдельные записи с конкретным пользователем.

    Ну и ещё пара способов: 1. Использовать JSON-поля. Например, в таблице пользователей может быть создано поле "content", в котором будет храниться JSON-объект, содержащий информацию о публикациях, комментариях, ответах и прочих данных, связанных с пользователем. Однако, такое решение может усложнить поиск и фильтрацию данных.

    2. Использовать таблицы на основе пользовательских идентификаторов. При таком подходе создаются отдельные таблицы для каждого типа данных, например, "publications", "comments", "replies" и т.д., каждая из которых содержит поля, связывающие запись с идентификатором пользователя. Таким образом, можно создать множество записей, связанных с одним пользователем, и при этом уменьшить вероятность дублирования данных.
    Ответ написан
    Комментировать
  • Как постоянно получать данные с БД?

    uvelichitel
    @uvelichitel
    habrahabr.ru/users/uvelichitel
    "хэндлер, который принимает вебхуки с текстовыми сообщениями и пишет их в базу" разве не может сразу ещё отправлять эти сообщения в "сокет, который создает общий чат с людьми" ?
    Или, если операции блокирующие, то отправлять в `очередь сообщений`. Может быть и база не нужна?
    Ответ написан
    Комментировать
  • Как постоянно получать данные с БД?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Почитать про брокеры, типа kafka/rabbit mq
    Ответ написан
    1 комментарий
  • Как правильно сделать таблицу в бд?

    rozhnev
    @rozhnev
    Fullstack programmer, DBA, медленно, дорого
    HTML хранится в базе. В HTML ссылки на картинки. Сами картинки хранятся на сервере в месте соответствующем ссылке на файл
    Ответ написан
    Комментировать
  • Как обновлять различные состояния в зависимости от переменной?

    @karminski
    Senior React.JS Developer
    Сделайте проще
    const [errors, setErrors] = useState({
        name: '',
        teleph: '',
        email: '',
    });
    
    // когда нужно устанавливается одну ошибку
    setErrors({ ...errors, [name]: value })
    // где name - имя ключа объекта с ошибками, value - значение ошибки
    Ответ написан
    1 комментарий
  • Применение объекта req.query на сервере node js?

    Grapeoff
    @Grapeoff
    В чём концепция...?
    А как без req.query вы передадите какие-либо дополнительные данные в GET запросе? GET запросы не могут иметь тела, однако для пагинации limit и offset как-то надо прислать, вот и остаются query параметры.

    GET /entity?limit=10&offset=0

    Если сделать это параметрами, то это будет выглядеть как-то так

    GET /entity/10/0

    Согласитесь, что реализовывать это так — очень плохая идея. Даже если не брать во внимание полное отсутствие читаемости, мы как минимум лишаем себя возможности сделать роут GET /entity/:id, тк перекрываем его предыдущим роутом.
    Ответ написан
    Комментировать
  • Как при выводе данных из базы модифицировать одно из полей?

    Alex_Geer
    @Alex_Geer
    System Engineer
    Для преобразования HTML-кода в текст вам необходимо использовать функцию decodeEntities. В вашем случае, чтобы преобразовать поле "name" каждого объекта в HTML-код, вам нужно пройтись по массиву объектов с помощью метода map и применить функцию decodeEntities к полю "name". Вот пример кода на Node.js:
    const entities = require('html-entities').AllHtmlEntities;
    
    connection.query("SELECT * FROM database", function(error, results) {
        const decodedResults = results.map(result => {
            return {
                id: result.id,
                name: entities.decode(result.name)
            };
        });
        res.json(decodedResults);
    });
    Ответ написан
    9 комментариев
  • Как подключить PostgreSQL к react-app вебсайту?

    Viji
    @Viji
    DevOps Engineer
    react --> backend приложение на сервере или в облаке (например node.js, express, python django and any 1000s of others) ---> база данных PostgreSQL
    Ответ написан
    Комментировать
  • Identifier has already been declared как исправить?

    @Bhudh
    И ещё: называть переменную open есть большая глупость.
    Ответ написан
    1 комментарий
  • Как построить aggregate запрос для mongoose?

    hzzzzl
    @hzzzzl
    монгусовский populate не выйдет совместить с аггрегацией в одном запросе,
    попробуй как-то так

    Post.aggregate([
      { 
        $lookup: {
          from: 'definitions',
          localField: 'definition',
          foreignField: '_id',
          as: 'definitions'
        } 
      },
      {
        $match: {
          'definitions.likes': { $gte: 10 }
        }
      }
    ])


    (если не выйдет, то предлагаю потыкать аггрегацию в mongodb compass, там очень наглядно будет расписываться каждый шаг)

    а вообще, нет причин хранить лайки и заголовок поста отдельно от поста
    Ответ написан
    1 комментарий
  • Node.js, promise, mysql как выдать результат?

    Negezor
    @Negezor
    Senior Shaurma Developer
    Что-то вы совсем намудрили, всё гораздо проще.
    getEmail() {
    	return new Promise((resolve, reject) => {
    		this.start();
    
    		this.db.query('SELECT * FROM contacts', (err, contacts) => {
    			if (err) {
    				reject(err);
    
    				return;
    			}
    
    			const emails = contacts
    				.map(contact => contact.email)
    				.filter(Boolean);
    
    			this.end();
    
    			resolve(emails);
    		});
    	});
    }

    _db.getEmail()
    	.then((emails) => {
    		console.log(emails)
    	})
    	.catch((error) => {
    		console.log('Error in the Query', error);
    	});

    По хорошему бы сделать что бы запросы к БД сразу возвращали Promise тогда это станет гораздо удобней.
    Ответ написан
    3 комментария
  • Какой биллинг выбрать для сервиса по подписке?

    @boss_lexa
    https://paddle.com
    https://payproglobal.com

    1$ слишком маленькая сумма - платежный провайдеры как правило берут фикс комиссию $0.3- $0.5 + % . Подумайте о том чтобы брать платеж сразу за полгода например
    Ответ написан
    Комментировать
  • Кто подскажет js-библиотеку для работы слайдера?

    @thereal_kh
    Более менее опытный фронт-энд разработчик.
    Ответ написан
    Комментировать
  • Node.js, promise, mysql как выдать результат?

    @Coder321
    _getEmail() {
        const emails = [];
        return new Promise((resolve, reject) => {
            this.start();
            this.db.query('SELECT * FROM contacts', (err, res) => {
                if (!!err) {
                    return reject('Error in the Query');
                } else {
                    res.forEach(function (item, i) {
                        if ((item.email !== '') && (item.email !== null)) {
                            emails.push(item.email);
                        }
                    });
                    this.end();
                    return resolve(emails);
                }
            });
    
        });
    }
    
    async getEmail(){
        try {
            const emails = await this._getEmail();
        } catch (error) {
            console.log(error);
        };
    }
    Ответ написан
    Комментировать
  • Как вставить .webp изображения через background?

    PavelMonro
    @PavelMonro
    Создайте функцию проверки
    function ThisIsWebP() {
        var def = $.Deferred(), crimg = new Image();
        crimg.onload = function() { def.resolve(); };
        crimg.onerror = function() {def.reject(); };
        crimg.src = "https://simpl.info/webp/cherry.webp";
        return def.promise();
    }


    И проверяем:
    ThisIsWebP().then(function() {
        //Есть поддержка webp
    }, function() {
       //Нет поддержки webp
    });
    Ответ написан
    1 комментарий