• Как добавить отношения "многие-ко-многим" между таблицами из разных баз данных?

    Если вы разделяете проект на микросервисы, но связываете при этом их данные, то вы просто делаете распределённый монолит. А когда вы ещё и базу разрываете на два куска, при этом пытаясь сохранить между ними традиционные связи, как внутри одной базы данных, то вы:
    1. Не решаете абсолютно ни одной из задач микросервисов, т к. сервисы остаются жёстко связанными. Всё можно было бы решить просто при помощи "Clean architecture", DDD и т.д.
    2. Вы добавляете себе невероятное количество головной боли, связанной с самой микросервисной архитектурой, но и плюс все прелести из п.1.
    3. И тогда нафига козе баян?

    - Микросервисы должны иметь полностью независимые базы данных
    - Все взаимодействия должны осуществляться исключительно по API (это мой ответ на ваш вопрос). Как только вы связываете схемы данных, вы теряете весь смысл микросервисов.
    - Вы должны обязательно реализовать распределенные транзакции. Вы должны сами писать код для таких транзакций. А вспомните, как приятно и просто делать транзакции в монолите с одной базой данных.
    - Взаимодействие между микросервисами должно осуществляться на базе строжайших контрактов, которые можно менять только после обсуждения со всеми людьми, разрабатывающими данные микросервисы. Вам неплохо было бы выдумать или позаимствовать какой-то фреймворк, где четко будут описаны общие и частные принципы общения микросервисов.
    - Вы должны обеспечить мониторинг всего и вся, оповещение об отказах и деградации микросервисов
    - Вы должны обеспечить распределенное логирование, чтобы уметь отслеживать даже, например, простые запросы между логами из нескольких независимых систем.
    - И т.д. и т.п.

    Оно вам надо?
    Ответ написан
    Комментировать
  • Как добавить отношения "многие-ко-многим" между таблицами из разных баз данных?

    @rPman
    Если это сделано специально то не надо так делать.

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

    Если прямо очень надо, то для начала нужно понять, какая сторона будет 'главной', кто будет выдавать идентификаторы и следить за их согласованностью. Если главного выбрать не получается, то идентификаторы можно создавать двумя способами:
    - генерация GUID, который специально разработан быть статистически уникальным, на чьей бы стороне он не был создан (128бит)
    - добавление в идентификатор объекта идентификатора ноды, алгоритмы бывают разные, самый простой, определить максимальное количество нод и выделить в идентификаторе несколько бит для их номера (например максимальное количество нод 256, это 8бит в идентификаторе, пусть будут младшие)
    Ответ написан
    Комментировать
  • Как извлечь топ 15 очков из таблицы чтобы игроки не дублировались?

    @rPman
    так?
    SELECT user_id, name, MAX(points) as max_points
    FROM `games`
    GROUP BY user_id, name
    ORDER BY max_points DESC
    LIMIT 15;
    Ответ написан
    1 комментарий
  • Как сохранить mysql базу?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    На будущее, формат, в котором сохраняется БД, называется "дамп".
    А дальше всё просто, как сохранить дамп в mysql workbench
    Ответ написан
    Комментировать
  • Объясните CASE WHEN THEN?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    $this->database()->query('UPDATE ' . $this->database()->getTable('ad') . ' SET view = 0 WHERE ad_id = 34');
    $this->database()->query('UPDATE ' . $this->database()->getTable('ad') . ' SET view = 1 WHERE ad_id = 35');
    $this->database()->query('UPDATE ' . $this->database()->getTable('ad') . ' SET view = 2, amount=466 WHERE ad_id = 36');

    И не делайте себе мозги.
    Вы и сейчас-то смотрите на этот запрос как баран на новые ворота. А через месяц и вовсе перестанете понимать, что имели в виду.
    Ответ написан
    Комментировать
  • Несколько разных dns серверов?

    martin74ua
    @martin74ua
    Linux administrator
    Зачем писать NS от mail.ru ?
    Они предлагают это сделать для ленивых - чтобы не вникать, какие записи надо внести в домен - передайте домен на dns хостинг к нам и не думайте.
    Почитайте внимательно их документацию, они вам скажут, что конкретно надо добавить в доменную зону. И все у вас будет хорошо...

    А мешать в одном домене ns сервера с разных провайдеров - это такое.. На клаудфларовском у вас нету записей от mail.ru, на mail.ru нету записей от клаудфлара... В результате - почта у вас то работает, то не работает... Сайт то открывается, то не открывается....
    Ответ написан
    1 комментарий
  • Что сработает быстрее, что лучше использовать?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Хороший вопрос, хотя и задавался миллион раз.

    Когда у вас выполняется запрос
    SELECT * FROM users WHERE DATE(created_at) = '2024-04-14'
    то СУБД должна пройти весь индекс до конца, получить каждое значение created_at, применить к нему функцию, сравнить с переданным значением, и добавить строку в результат запроса.

    Когда у вас выполняется запрос
    SELECT * FROM users WHERE created_at BETWEEN '2024-04-14 00:00:00' AND '2024-04-14 23:59:59'

    То СУБД находит бинарным поиском первое нужное значение, потом бежит по заранее отсортированному индексу и возвращает все значения до последнего, подходящего под второе условие.
    Ответ написан
    4 комментария
  • Заразятся ли 2 раздела диска если на один из разделов попадёт вирус?

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

    если он лежит неактивным файлом на носителе, то даже в соседнюю папочку его можно скопировать только ручками.
    Ответ написан
    Комментировать
  • Как получить доступ у серверу извне?

    CityCat4
    @CityCat4
    Внимание! Изменился адрес почты!
    Рисуем схему.
    Обозначаем подсети и адреса.
    Берем и пытаемся "вручную" доставить пакет от точки к точке. Что значит "вручную"? Это значит, что проговариваем действия, которые должна выполнить система для успешной доставки пакета (абстрагируясь в этот момент от того, что там стоит).
    Когда пакет "доставлен" - начинаем проверять - а все ли необходмые условия для его доставки соблюдены? Маршрутизация, разрешение на файрволлах, NAT, всевозможные хитрости... и таким образом приходим к тому, что надо сделать.
    Ответ написан
    Комментировать
  • Как перезаписать файл в Linux без права на его прочтение?

    AshBlade
    @AshBlade
    Просто хочу быть счастливым
    2 варианта:

    1. Полностью перезаписать его: echo 'New data' > write-only-file
    2. Дозаписать данные в конец: echo 'New data at end' >> write-only-file
    Ответ написан
    2 комментария
  • Будет ли доступен принтер из другой подсети?

    @alexalexes
    Asus RT-G32 или WL-520GC

    Отключаете на этих устройствах DHCP-сервер, втыкаете в него шнурок в любой lan порт (не wan!) от роутера TL-WR740N (на котором включен DHCP-сервер). Получаете точно такой же свитч, как у вас Dlink.
    Ответ написан
    1 комментарий
  • Что такое кластерный индекс в mysql?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    6 комментариев
  • Подключение коммутатора к роутеру?

    @TheBigBear
    СтарОдмины мы
    1. Проверь провода.
    для линка 100Мбит достаточно 2 пар (оранжевая + зеленая), так что при пропадании синей или коричневой пары линк будет переходить с 1Гбит на 100 Мбит
    А TP-Linkи вполне надёжные аппараты
    2. DHCP сервер нисколько не нагружает ни сеть, ни роутер. Его задача - раз 10 мин (раз в час или сутки - как настроено) предоставить IP адрес обратившемуся к нему устройству. Да и не попадались мне коммутаторы (кроме микротика) с функцией DHCP сервера
    3. Именно так. И я так понимаю - основной трафик сейчас в сети генерируют камеры в регистратор? Но так они уже и гоняют его по своему Poe коммутатору
    И совет
    Если устройство (например принтер) имеет и LAN и WiFI - подключай по LAN. Так надёжней
    Ответ написан
    7 комментариев
  • Как разделить сеть на несколько подсетей, чтобы в каждой был определенный вид устройства и настроить для каждой сети получение адреса по dhcp?

    martin74ua
    @martin74ua Куратор тега Сетевое администрирование
    Linux administrator
    выкинуть неуправляемый коммутатор, использовать только управляемые
    если надо так поделить сети - используйте вланы.
    Ответ написан
    Комментировать
  • Какой поставить прокси на предприятие?

    ky0
    @ky0
    Миллиардер, филантроп, патологический лгун
    Локальная PKI у вас развёрнута, для начала? Иначе не знаю, чего вы там при повсеместном, слава тебе, господи, распространении HTTPS, собираетесь контролировать.

    Сквид не устарел.
    Ответ написан
    3 комментария
  • Как осуществить поиск (like) по полю в массиве в json колонке?

    @alexalexes
    Сделать нормализацию структуры базы.
    Перенести JSON в таблицу user_phone.
    Поля:
    phone_id, -- первичный ключ телефона
    user_id, -- внешний ключ, кому относится телефон
    phone, -- телефон
    phone_comment, -- комментарий к телефону
    -- еще поля по вкусу, но иногда выручающие
    is_main, -- основной не основной/порядок приоритета
    add_date -- дата внесения телефона
    И в запросах уже нормально джойнить и лайкать эту таблицу.
    PS:
    В качестве временного костыля (ни в коем случае не оставлять на постоянной основе!):
    SELECT Users.*,
           ph.value->>'phone' as phone
    FROM Users, json_array_elements(Users.phones) as ph
    where ph.value->>'phone'   like '7%3';
    Ответ написан
    3 комментария
  • Как подсчитать и вывести количество совпадений значения в строке при запросе в MySQL?

    @alexalexes
    Если у вас MySQL 8, то дубликаты телефонов можно найти тривиально:
    select A.*
      from (SELECT `date`, `name`, phone, count() over (partition by phone) phone_count
            FROM `myusers`
    ) A
    where A.phone_count > 1
    ORDER BY date ASC

    Если MySQL 5, то придется немного по сложнее:
    select `date`, `name`, phone, p.phone_count
    from `myusers` as mu
    join (SELECT phone, count(*) phone_count
             FROM `myusers`
             group by phone) p on p.phone = mu.phone
    where p.phone_count > 1
    ORDER BY mu.date ASC
    Ответ написан
    4 комментария
  • Как правильно создать триггер?

    tsklab
    @tsklab
    Здесь отвечаю на вопросы.
    У вас все поля в пределах одной таблицы. Почему не вычисляемое поле?

    Как указал Akina использовать NOW() нельзя, но с учётом того, что срабатывание триггера выполняется только один раз, в момент на которое указывает поле modified можно использовать его. Также приведя условия статуса к верной логике получаем (MySQL online):
    -- create
    CREATE TABLE airdrops (
        start_date datetime NOT NULL,
        end_date datetime NOT NULL,
        modified timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
        status int(11) AS ( case
                              when modified < start_date THEN 0
                              when modified >= start_date AND modified <= end_date THEN 1
                              when modified > end_date THEN 2
                              else -1
                            end )
        );
    -- insert
    INSERT INTO airdrops (start_date, end_date) VALUES ( '2024-03-12', '2024-03-31') ;
    INSERT INTO airdrops (start_date, end_date) VALUES ( '2024-03-01', '2024-03-31') ;
    INSERT INTO airdrops (start_date, end_date) VALUES ( '2024-03-02', '2024-03-09') ;
    -- fetch 
    SELECT * FROM airdrops;


    статус 2 устанавливался автоматически если текущая дата
    Использовать представление (MySQL online)
    -- create
    CREATE TABLE airdrops (
        start_date datetime NOT NULL,
        end_date datetime NOT NULL
        );
    -- insert
    INSERT INTO airdrops (start_date, end_date) VALUES ( '2024-03-12', '2024-03-31') ;
    INSERT INTO airdrops (start_date, end_date) VALUES ( '2024-03-01', '2024-03-31') ;
    INSERT INTO airdrops (start_date, end_date) VALUES ( '2024-03-02', '2024-03-09') ;
    -- view
    CREATE VIEW airdrops_status
    AS
    SELECT start_date, end_date,
          case
            when NOW() < start_date THEN 0
            when NOW() >= start_date AND NOW() <= end_date THEN 1
            when NOW() > end_date THEN 2
            else -1
          end AS status
      FROM airdrops;
    -- fetch 
    SELECT * FROM airdrops_status;
    Ответ написан
    6 комментариев
  • Как в PhpMyAdmin посмотреть историю изменения названия полей таблицы?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Никак, если вы сами её не сохраняли. MySQL таких логов не ведёт.
    Ответ написан
    2 комментария