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

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

    А ничего. НЕ хранить ежедневные итоги. Только приходы и уходы. И самая первая запись - только приход (начальный баланс), если начинаем не с пустой кассы. А сумму с накоплением считаем непосредственно в запросе, в тот момент, когда потребовался отчёт.

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

    @Akina
    Сетевой и системный админ, SQL-программист.
    Какое должно быть расстояние до веб севера, чтобы запроса гарантировано шел прямо к нему . Без промежуточных серверов. Тогда можно будет рассчитать время ответа сервера.

    Без промежуточных? Расстояние - в пределах домена коллизий.
    Однако даже в таком случае расчёт времени невозможен. Например, оно может увеличиться (и сильно), если перестраивается RSTP.
    Ответ написан
  • Как получить количество первичных записей в таблице?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Если принять такую формулировку:

    Первичным является товар, одновременно с которым куплено больше всего других товаров

    то запрос на получение "первичных" товаров будет такой:

    WITH cte AS (
        SELECT t1.cat_id, RANK() OVER (ORDER BY COUNT(t2.cat_id) DESC) rnk
        FROM user_to_cat t1
        JOIN user_to_cat t2 ON t1.user_id = t2.user_id
                           AND t1.cat_id <> t2.cat_id
        GROUP BY 1
        )
    SELECT category.code
    FROM cte
    JOIN category ON category.id = cte.cat_id
    WHERE rnk = 1

    На данных из fiddle запрос даст 2 товара - orange и pear, оба они участвуют в 6 парах, тогда как apple участвуют в 4, а lemon в 2 парах.
    Ответ написан
  • Как составить запрос выборки баллов?

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

    Мне нужно найти запись на который у пользователя где у пользователя 1 накопится допустим 30 баллов, это запись id=5.


    WITH cte AS (
        SELECT *, SUM(point) OVER (ORDER BY point_lifetime) cum_sum
        FROM tablename
        WHERE user_id = 1 --   у пользователя 1 
        )
    SELECT *
    FROM cte
    WHERE cum_sum >= 30   --   накопится 30 баллов
    ORDER BY point_lifetime LIMIT 1;


    PS. Поскольку значения в point_lifetime неуникальны, то однозначного решения может и не быть. Во всяком случае до тех пор, пока не будет точно определён порядок записей при равенстве значений этого поля.
    Ответ написан
    Комментировать
  • Как изолировать 2 сегмента с помощью VLAN на оборудовании Cisco, чтобы они оба имели выход в третий?

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

    В условиях, когда все три узла подключены к одному коммутатору, спасти может только запрет форвардинга с порта Fa0/1 на Fa0/2 и обратно - если такая возможность в коммутаторе вообще есть. По-русски это обзывается "Изолированный режим". Не знаю как он обзывается у Циски - а, например, в D-Link это называется Traffic Segmentation. И выглядит вот так:

    6564623ea9bac451405414.png

    UPDATE.

    Вроде у сиськи он обзывается так же. См. https://www.cisco.com/c/en/us/products/security/wh...

    То есть просто находишь сию настройку, включаешь сегментацию, и разрешаешь Fa0/1 форвардить только на Fa0/3, то же для Fa0/2, а вот Fa0/3 разрешаешь форвардинг и на Fa0/1, и на Fa0/2.

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

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

    Триггер - это хранимый объект, который описывает реакцию на указанное событие. Обычно это событие изменения данных (удаление, вставка, обновление данных таблицы), реже (и не в каждой СУБД поддерживается) событие изменения метаданных (создание, изменение или удаление хранимых объектов или модификация их свойств). Данная реакция заключается в выполнении соответствующего кода (триггерной процедуры либо триггерной функции, зависит от СУБД). Выполняемый код может модифицировать как сами изменяемые объекты, действие над которыми вызвало срабатывание триггера (т.е. модифицировать выполняемые модификации), так и другие объекты. Триггер сам по себе ничего и никуда не возвращает, триггерная процедура тоже ничего не возвращает, триггерная функция - возвращает обновлённое состояние объекта, действие с которым вызвало срабатывание триггера.
    Ответ написан
    Комментировать
  • Как сделать верную группировку в Union?

    @Akina
    Сетевой и системный админ, SQL-программист.
    SELECT id, MIN(type) type
    FROM t1
    WHERE type IN (1, 2)
    GROUP BY id
    Ответ написан
    4 комментария
  • Стоит ли переноносить таблицу из базы mysql?

    @Akina
    Сетевой и системный админ, SQL-программист.
    MySQL глубоко параллельно, в какой БД лежит таблица (надеюсь, innodb_file_per_table включен?). Посему вынос таблицы в отдельную БД не окажет вообще никакого влияния на работу системы. Разве что незначительно изменится процент кэширования - но скорее всего это даже детектировать не выйдет.

    Если это высоконагруженная таблица с большим потоком запросов на изменение, то имеет смысл для неё создать отдельный tablespace и вынести его на быстрый (SSD) раздел. Плюс согласен с Everything_is_bad - партиционирование (в зависимости от вида основного шаблона запросов в потоке - по юзеру или по дате) может способствовать оптимизации работы с таблицей.
    Ответ написан
    Комментировать
  • Как распределить число равномерно?

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

    Количество(Склад Номер Х) = ВсегоТовара * НомерСклада / ВсегоСкладов - Количество(Склады Номер 1 .. Х-1)


    Т.е. если, как в вопросе, три склада и 5 товаров:

    Склад 1: количество = 5 * 1 / 3 - 0 = 1,666 = 2 штуки
    Склад 2: количество = 5 * 2 / 3 - 2 = 1,333 = 1 штука
    Склад 3: количество = 5 * 3 / 3 - (2 + 1) = 1,666 = 2 штуки


    $amount = 5;
    $num = 3;
    
    for($used = 0, $i = 1; $i <= $num; $i++) {
      $used += ($current = round($amount * $i / $num - $used));
      echo("$i: $current\n");
    }


    https://phpize.online/sql/mysql57/undefined/php/ph...
    Ответ написан
  • Как можно оптимизировать SQL запрос?

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

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

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

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

    Хотя как по мне, следует отделить систему безопасности Постгресса от авторизации в приложении. Мнение по данному вопросу от Everything_is_bad в комментарии - это не сарказм, а весьма правильное замечание.
    Ответ написан
    Комментировать
  • Лимит на количество L2-vlan на L3 коммутаторе brocade?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Документация на странице 7 утверждает, что девайс поддерживает полный набор виланов, все 4096 штук.
    Ответ написан
    Комментировать
  • Как исправить ошибку связанную с FULL JOIN?

    @Akina
    Сетевой и системный админ, SQL-программист.
    MySQL в принципе не знает о существовании FULL JOIN. И это как раз тот редчайший случай, когда сообщение об ошибке не соответствует проблеме.

    Проблема решается эмуляцией. Есть как минимум два варианта:

    SELECT * FROM table1 LEFT JOIN table2 USING (column)
    UNOIN ALL
    SELECT * FROM table1 RIGHT JOIN table2 USING (column) WHERE table1.column IS NULL

    SELECT *
    FROM (
        SELECT DISTINCT column FROM table1
        UNION ALL
        SELECT DISTINCT column FROM table2
        ) AS table0
    LEFT JOIN table1 USING (column)
    LEFT JOIN table2 USING (column)

    Во втором варианте кажется, что DICTINCT не нужны - но с ними работать будет заметно быстрее, особенно если поле индексировано.
    Ответ написан
    2 комментария
  • Как из word перенести таблицу в Excel с сохранением стилей и форматом?

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

    Нет, нельзя. Ширина колонки и высота строки - это именно атрибут колонки/строки. А не прямоугольного диапазона ячеек, в который выполнится вставка. Так что двигать - придётся.

    Всё остальное (шрифты, цвета, заливка, выравнивание и пр.) должно копироваться нормально. При условии, что задано явно, а не используется дефолтная настройка. И при условии, что диапазон назначения заранее настроен на тип данных текстовый. Иначе преобразований некоторых значений в даты, выравнивание чисел по правому краю и прочих прелестей не избежать...

    PS. Можно эту таблицу вставлять не как значения ячеек, а как объект Документ MS Word. Вот тогда точно ничего не уплывёт.
    Ответ написан
    4 комментария
  • Как правильно хранить изображения в SQL и как правильно работать с ними в WPF проекте?

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

    Наилучшее решение - файлы хранятся в FileTables либо FILESTREAM, а в таблице лежат ссылки на них. Что приятно - при этом не надо распыляться с безопасностью, за ней следит SQL Server.

    Сравнение параметров для хранения больших двоичных...

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

    PS. Пройдя по ссылке - обязательно прочитать и оригинальный ихнеязычный текст. Как, впрочем, и для любого другого машиннопереведённого текста.
    Ответ написан
  • В чём разница прописывании VLAN на порт коммутатора Awaya?

    @Akina
    Сетевой и системный админ, SQL-программист.
    vlan members 831 21

    Данная команда включает порт 21 в VLAN 831 в режиме tagged. Порт функционирует как trunk либо hybrid.

    vlan ports 21 pvid 831

    Данная команда включает порт 21 в VLAN 831 в режиме untagged. Порт функционирует как access либо hybrid.
    Ответ написан
    Комментировать
  • MySQL автоматически увеличивает размер ячейки?

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

    В MySQL нет "ячеек" - это не Excel. Есть записи, есть поля, есть поле отдельной записи.

    Если в ячейку типа TEXT не влазят данные, MySQL автоматически увеличит её до необходимого размера или выдаст исключение?

    Если размер данных превышает размер для типа данных поля - будет выдана ошибка или предупреждение "data too long". Что именно будет выдано - зависит от того, какой запрос, и от текущих настроек сессии.

    Как сделать "резиновую" ячейку в таблице?

    Никак. Но если нужно помещать в таблицу данные, которые не лезут в LONGTEXT (а это ни много ни мало 4 гигабайта!) - то Вы явно выбрали инструмент не по задаче. Храните такое в файловой системе.
    Ответ написан
  • Почему не даёт зайти в общую папку?

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

    Мой компьютер - ПКМ - Управление - Общие папки - Общие ресурсы - нужный ресурс - ПКМ - Свойства - Разрешения для общего ресурса

    Заодно проверьте в локальных политиках, разрешен ли доступ из сети с пустым паролем (у юзеров пароли же не установлены, верно?). И не запрещён ли кому вообще доступ из сети.
    Ответ написан
  • Некоторые бинарные строки не определяются по оператору LIKE, проблема не дебажится, в чём может быть причина?

    @Akina
    Сетевой и системный админ, SQL-программист.
    LIKE в принципе не пригоден для указанной операции. Это чисто текстовый оператор. В частности, он безусловно применяет к обоим операндам регистронезависимый collation - в этих условиях сравнение БИНАРНЫХ строк способно давать весьма неожиданные эффекты.

    Если надо работать именно с бинарными строками - всё плохо. В MySQL нет нормальных функций для работы с ними.

    Для решения задачи рекомендую преобразовать бинарную строку в шестнадцатеричное представление, укоротить до 40-символьного (что соответствует 20-байтовому бинарному значению), преобразовать обратно, и сравнить.

    WHERE CONV(LEFT(HEX('$entered_hash'), 40), 16, 10) = correct_hash


    К тому же такое условие SARGable.

    PS. В выражении
    WHERE '{value1}' = '{value2}' OR '{value1}' LIKE '{value2}%'
    первое условие заведомо лишнее (ведь если оно выполняется, то и второе тоже выполняется).
    Ответ написан
    7 комментариев
  • Как формировать сырые SQL запросы максимально эффективно?

    @Akina
    Сетевой и системный админ, SQL-программист.
    Обычно если в запрос может быть передано значение, а может и нет, делают так:
    ... AND (column = {parameter} OR {parameter} IS NULL) ..

    При подстановке параметра сервер уже на этапе построения плана выполнения запроса, зная значение {parameter}, получит либо
    ... AND (column = {parameter} OR FALSE) .. ==> ... AND (column = {parameter}) ..
    либо
    ... AND (column = {parameter} OR TRUE) .. ==> ... AND (TRUE) ...

    PS. Чтобы не геморроиться с определением, когда ставить WHERE, начальный шаблон делают такой:
    SQL = "SELECT * FROM USERS WHERE 1=1 {} LIMIT %s OFFSET %s"

    и все дополнительные условия формируют в виде
    AND {условие}
    Тогда не надо оглядываться, первое это условие или нет.

    Само же условие 1=1 будет обращено в TRUE и отброшено опять-таки на этапе построения плана.
    Ответ написан
    2 комментария
  • MySQL PDO, Почему все значения при выборке типа string?

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

    То есть какие-то дополнительные преобразования, изменяющие тип данных, выполняет PHP уже после того, как он получил ответ от MySQL. Или не PHP, а коннектор, который PHP использует для доступа к MySQL. Но в любом случае это происходит уже на стороне клиента.

    Предположу, что эмуляция - процесс двусторонний. То есть не только на пути "туда", но и на обратном пути. Что при дополнительной обработке, которую требует настройка PDO::ATTR_EMULATE_PREPARES => true, корёжит тип данных.

    На всякий случай проверьте, не вызывает ли изменение этого флага корректировки других флагов. В частности, PDO::ATTR_STRINGIFY_FETCHES.
    Ответ написан