• Можно ли сделать такое отношение таблиц?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Связь типа M:N между продуктом и материалом должна трактоваться как самостоятельная сущность. И, как любая другая сущность, она может иметь свои собственные атрибуты.

    можно ли в промежуточную таблицу добавлять поле amount или это считается недопустимым?

    Количество в данном случае - атрибут именно связи, а не продукта и не материала. Посему поле количества в связывающей таблице не только допустимо, но и единственно правильно. При условии, что на комбинацию полей (product_id, material_id) наложено требование уникальности. Иначе должна существовать ещё одна таблица, которая ссылается на связующую таблицу и содержит поле количества.
    Ответ написан
    Комментировать
  • Как выбрать последнюю запись с group by?

    @Akina
    Сетевой и системный админ, SQL-программист.
    А решение было близко... раз нужны данные с разных уровней группировки, то либо вертеть подзапросы/CTE, либо использовать оконные функции. Как по мне, второе проще.
    SELECT DISTINCT
           product_id,
           size,
           SUM(orders) OVER (PARTITION BY product_id, warehouse_id, size) AS orders,
           FIRST_VALUE(stocks) OVER (PARTITION BY product_id, warehouse_id, size 
                                     ORDER BY `date` DESC) AS stocks,
           warehouse_id
    FROM stats
    WHERE DATE(`date`) >= '2023-09-01' 
      AND DATE(`date`) <= '2023-09-04';

    fiddle
    Ответ написан
  • Как построить дерево одним запросом c сортировкой по родителю?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Как-то так:
    WITH RECURSIVE
    cte AS (
        SELECT *, LPAD(id, 10, '0') path
        FROM comments
        WHERE parent_id = 0
      UNION ALL
        SELECT comments.*, CONCAT(cte.path, LPAD(comments.id, 10, '0'))
        FROM comments
        JOIN cte ON cte.id = comments.parent_id
    )
    SELECT id, parent_id, content
    FROM cte
    ORDER BY path;

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    созданы два дополнительных сайта на LARAVEL, с одинаковыми каталогами товаров.

    Фраза интенсивно намекает, что эти сайты - полная копия основного. То есть и код, и, главное, структура БД, совпадают с точностью до запятой.

    Соответственно первое, что приходит в голову - организация и настройка репликации. Под основным сайтом мастер, в регионах слейвы. Тогда больше вообще ничего не нужно делать, оно "само" отсинхронизируется.

    Если это по какой-то причине невозможно - то обновление стоимости товаров оформляется в виде необходимых для выполнения операции наборов INSERT/UPDATE/DELETE запросов и выполняется на всех трёх серверах.

    Стоимость товаров часто меняется, и менять цены руками на всех сайтах, основном и региональных - трудозатратно.

    Если это можно, хотя и затратно, сделать руками - то с точки зрения СУБД это ни разу не "часто", а наоборот - чертовски редко.
    Ответ написан
  • Почему тип столбца xml не проверяет входное значение?

    @Akina
    Сетевой и системный админ, SQL-программист.
    При этом по факту я спокойно вставляю в таблицу произвольную строку и никакой проверки не происходит, данные спокойно записываются в таблицу.

    Произвольный текст, не содержащий тегов, является валидным содержимым, но не XML документом. Не-XML фрагмент игнорируется при проверке.

    Попробуйте вставить нечто, являющееся документом/фрагментом XML, но с ошибкой в разметке - тут же схлопочете ошибку.
    DEMO
    Ответ написан
    Комментировать
  • Какими соседями будут граничные клетки на замкнутой поверхности?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В матрице Z(0..m, 0..n) элемент X(a,b) является соседом элемента Y(c,d), если выполняются условия
    ((a-b) MOD (m+1)) входит в {0, 1, m}
    ((c-d) MOD (n+1)) входит в {0, 1, n}

    В случае, если соседи определяются только по вертикали/горизонтали, но не по диагонали, то одно из выражений должно быть нулём. Если только по диагонали - нуля быть не должно. Если оба выражения нулевые.. догадайся сам.

    PS. MOD - оператор получения остатка от целочисленного деления.
    Ответ написан
    Комментировать
  • Как работает кластер galera?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Данные поступают на один из серверов кластера. Оттуда они распространяются/реплицируются на остальные серверы кластера. Очевидно, что процесс передачи на другие серверы - не мгновенный, и требует некоторого времени. И столь же очевидно, что если после получения новых данных, но до передачи их в другие серверы кластера исходный сервер сдох, то этих данных не будет на оставшихся серверах, и, как Вы правильно заметили, запросы будут выполняться с устаревшими данными.

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    Хотим открыть общий доступ к файлам Microsoft Office по сети, чтобы пользователи могли редактировать, но не удалять файлы.

    Ставим сетевую корзину (программа третьей стороны, практически любая подойдёт, лишь бы запоминала, кто удалил). Удалённый файл, в отличие от обычной процедуры в Windows, не уходит в никуда, а помещается в сетевую корзину.

    Если туда попал именно окончательно удалённый файл (а не удалённый в связи с созданием новой версии) - восстанавливаем, а потом находим виновного и выписываем ему крепких и качественных звездюлей. Без последнего этапа схема практически не работает - как удаляли что не надо, так и будут удалять..
    Ответ написан
    2 комментария
  • Как составить запрос sql?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Для решения задачи набор искомых значений должен быть (синтетическим) набором записей, который используется в источнике данных запроса.
    Ответ написан
    Комментировать
  • Где ошибка в строке запроса к PosgreSQL?

    @Akina
    Сетевой и системный админ, SQL-программист.
    В запросе, использующем более одной таблицы, все имена полей должны указываться как минимум с алиасом таблицы.

    Ну и, спрашивая про запрос, следует показывать не код на питоне, а именно текст запроса.
    Ответ написан
    Комментировать
  • Решает ли коммутатор с проблему максимальной скорости в роутере?

    @Akina
    Сетевой и системный админ, SQL-программист.
    It depends.

    Если устройства достижимы друг для друга напрямую (они в одной подсети) - будут общаться напрямую. Если нет - будут маршрутизироваться через роутер.
    Ответ написан
    1 комментарий
  • Как подключить два системных блока к 1 монитору?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если монитор имеет опцию PiP (картинка в картинке) либо PbP (картинка рядом с картинкой) - то вообще без проблем. Иначе - переключение через меню монитора или, как сказал Stalker_RED, командами DDC.

    Ещё вариант - подключить монитор только к одному из компов, и с него же подключиться к удалённому рабочему столу второго компа. Правда, при этом необходимо, чтобы компы были объединены сетью.
    Ответ написан
    Комментировать
  • Правильно ли сделаны VLAN?

    @Akina
    Сетевой и системный админ, SQL-программист.
    1. Каждый DHCP-скоп должен "сидеть" в своём VLAN. Так что VLANID=10 для DHCP-сервера - явно неправильно. Он должен раздавать адреса юзерам и, возможно, принтерам, так что два скопа и три VLANID (ибо он сервер и должен быть в VLAN серверов). Да, серверы с динамическим IP - это более чем странно, даже при статическом резервировании.

    2. Клиентских портов - да, не требуется. А вот на транке добавь, хуже не будет.

    3. Аналогично - лучше добавь.

    4. Можно и так, и эдак. Как по мне - принтсервер таки сервер, вот и пусть его в сегменте серверов. А вообще я б его делал двухинтерфейсным, наверное - один в серверах, второй с принтерами, так ему проще будет отлавливать включение-выключение принтеров.

    5. Так принт-сервер и его очереди же публикуются через домен, а доступ к нему маршрутизируется. Зачем тебе прямой доступ клиентов к принтсерверу?
    Ответ написан
  • Будет ли у роутера два ip если он создает подсеть?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Нет такого понятия - "роутер создаёт подсеть". Подсеть просто существует - потому что может. А любое оборудование (в том числе и роутер) либо узел в этой подсети, либо нет. Либо, при ошибке настройки, попадает в эту подсеть, но из-за несовпадения маски функционирует частично неправильно.
    Ответ написан
    Комментировать
  • Правильно ли составлена схема сети (теория)?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Навскидку:

    1. Звезда - плохо. Случись что, и сегмент отвалится. Я бы делал как минимум кольцо, и в него ERPS или RSTP (ещё лучше - кольцо на ERPS, а дальше RSTP). Ещё лучше - два кольца. И из тех же соображений надёжности - минимум два магистральных коммутатора на площадку/здание.
    2. Неуправляемые коммутаторы - забудьте как страшный сон. Например, надо перестартовать камеру по питанию - что, бежать к камере? да даже элементарно посмотреть статус коннекта... ставьте PoE L2.
    3. Транки я бы делал 10G.
    4. Оптический коммутатор в центре достаточно L2 или L2+. У него вообще все порты будут в транке (tagged).
    5. По части подсетей - для указанного количества оборудования я бы брал подсети /23 или /22 из 172.16. Избыток адресов ни на что не влияет, а их недостаток - это по определению геморрой. Оно надо?
    6. Если подсеть исчерпала адреса - то перестраиваешь DHCP-сервер, раздающий адреса. Либо расширяешь подсеть, либо добавляешь ещё один скоп и организуешь маршрутизацию. Второе правильнее - ибо в любом сегменте найдётся оборудование со статическим назначением адресов (не статическое резервирование!), при изменении маски их придётся перенастраивать.
    7. И я как-то не увидел управляющего VLAN, в котором будут только административные адреса коммутаторов.
    Ответ написан
    6 комментариев
  • Как в базе данных хранить информацию о нескольких периодах?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Ну вариант первый - это просто хранить данные за день, а всякие укрупнения считать в момент необходимости.

    Вариант соответственно второй - считать все укрупнёнки в момент записи текущих данных. Удалять/чистить лучше отдельной эвент-процедурой, если старая укрупнёнка недельку полежит, никто не помрёт. Вопрос отдельных таблиц под разные укрупнёнки - только если их структура различна в зависимости от периода, иначе одна таблица и поле маркер - диапазон периода записи.
    Ответ написан
  • Как написать условие - диапазон вне диапазона?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Условие пересечения диапазонов: начало любого диапазона меньше конца другого диапазона.

    (x < b) AND (a < y)

    Условие непересечения: начало какого-либо одного диапазона больше конца другого.

    (x > b) OR (a > y)

    Если касание допустимо - использовать нестрогие неравенства.
    Ответ написан
    Комментировать
  • Как получать данные из формы на сайте в разные таблицы БД?

    @Akina
    Сетевой и системный админ, SQL-программист.
    При добавлении набора данных в связанные таблицы (а по большому счёту - вообще всегда) следует забыть о существовании INSERT .. VALUES и пользоваться исключительно INSERT .. SELECT. Первый запрос вставляет запись в основную таблицу, второй вставляет в зависимую, получая необходимое для связывания значение из основной по известным критериям отбора (по только что вставленным значениям, либо, в случае MySQL, из LAST_INSERT_ID).
    Ответ написан
    Комментировать
  • Почему выдает ошибку создание триггера?

    @Akina
    Сетевой и системный админ, SQL-программист.
    CREATE TRIGGER fff
    BEFORE INSERT ON stats
    FOR EACH ROW
       SET NEW.column11 = (NEW.column1 + NEW.column2 + NEW.column3 + NEW.column4 + NEW.column5 + NEW.column6 + NEW.column7 + NEW.column8 + NEW.column9 + NEW.column10) / 10;

    или
    DELIMITER ;;
    
    CREATE TRIGGER fff
    BEFORE INSERT ON stats
    FOR EACH ROW 
    BEGIN
       SET NEW.column11 = (NEW.column1 + NEW.column2 + NEW.column3 + NEW.column4 + NEW.column5 + NEW.column6 + NEW.column7 + NEW.column8 + NEW.column9 + NEW.column10) / 10;
    END;
    ;;
    
    DELIMITER ;
    Ответ написан
    Комментировать
  • Как установить максимальное количество строк в таблице?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Демонстрация метода замены вставки на обновление: fiddle.
    Ответ написан
    Комментировать