• На сколько популярно и корректно хранить данные в столбце в виде JSON строки?

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

    А это зависит от того, что с этими данными делать.

    Если сохранить/вернуть - да, вполне.
    Если найти по фрагменту - 50/50, и зависит в основном инструментов, имеющихся в конкретной СУБД.
    Если выполнить более сложную обработку (сумма, в т.ч. с накоплением, среднее, медиана и пр.) - скорее нет.
    Если использовать для связывания по фрагменту - почти наверняка нет.
    Ответ написан
    Комментировать
  • Как можно ускорить выполнение SQL запроса?

    @Akina
    Сетевой и системный админ, SQL-программист.
    если `prop_id` in (1,2,3,...) штук 20, может быть и больше, запрос выполняется 18 секунд, что прям совсем много.

    Критичное количество значений в таком списке - порядка 7..10, дальше действительно запрос резко замедляется.

    Workaround: создаём индексированную временную таблицу в памяти, записываем в неё набор значений, используем в запросе:

    CREATE TEMPORARY TABLE criteria (prop_id INT PRIMARY KEY) ENGINE = Memory
    SELECT prop_id FROM (VALUES ROW(1), ROW(2), ROW(3), ...) criteria (prop_id);

    и потом

    select `product_id`, count(*) as `cnt`
    from `product_prop`
    NATURAL JOIN criteria 
    group by `product_id`
    order by `cnt` desc


    Ну а ускорить ORDER BY по вычисляемому полю - вообще без шансов.
    Ответ написан
    4 комментария
  • Как сделать разные bullets у двух слайдеров?

    @zhnyaka
    самый простой вариант это прописать классы от родителя
    .main-pagination .swiper-pagination-bullet {}
    Ответ написан
    Комментировать
  • В какой базе данных лучше всего хранить данные для дашбордов?

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

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

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

    mayton2019
    @mayton2019
    Bigdata Engineer
    быстро сравнить структуры БД и сделать скрипт, который приводит одну БД к структуре второй?

    В этой задаче - большое количество подводных камней. Например что делать если в двух БД есть одинаковые
    поля но имеющие разный тип (NUMERIC / VARCHAR). Дилемма... Что делать с исчезающими полями?
    Удалять? Дилемма...

    Я вообще не видел коробочных решение которые бы работали на "раз-два-три". Всегда есть нюансы.
    И есть conditions которые нужно вбить или вкрутить в эти решения.

    Написать скрипты которые извлекают метадату из одной и из другой БД не очень сложно. Но само практическое
    применение подобных скриптов - ограничено. И я думаю что это как раз та причина по которой коробочные
    "миграторы" не прижились.
    Ответ написан
    Комментировать
  • Как сделать верную группировку в Union?

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

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    - if ($query = $db->query(statement: "SELECT * FROM products")) {
    + if ($query = $db->query(query: "SELECT * FROM products")) {
    - $info = $query->fetchAll(fetch_style:PDO::FETCH_ASSOC);
    + $info = $query->fetchAll(mode: PDO::FETCH_ASSOC);
    Не надо придумывать названия параметров из головы. Надо брать их из документации.
    Ответ написан
    5 комментариев
  • Как правильно хранить изображения в SQL и как правильно работать с ними в WPF проекте?

    Идеальное решение без лишних рассуждений

    Картинки - в S3, а перед S3 поставить CDN, чтобы сильно S3 не нагружать.
    В центральную базу данных на сервере - только идентификаторы картинок.

    Клиент (на WPF) будет обращаться к какому-то приложению, которое написано на ASP NET Core, а оно, в свою очередь, будет идти в центральную БД за всякой инфой.

    Опционально - клиент будет идти в CDN за картинками.
    Сами картинки потом пусть кэшируются в ФС, чтобы не нужно было идти за ними повторно.
    Данные о модах тоже можно кэшировать, но уже в sqlite - это полезно будет, пока нет интернета, или пока актуальный список модов загружается.



    Да, единственный хороший вариант хранить картинки в базе - это не хранить картинки в базе, а хранить лишь пути или идентификаторы картинок.

    Главный минус картинок в ФС - это то что они будут привязаны к одному серверу. Лучше хранить картинки в другой системе (S3 или CDN) и хранить в базе их идентификаторы, чтобы потом клиент мог сам их скачать, если это необходимо. Так раздача картинок не будет привязана к основному серверу.

    А клиент пусть их кэширует также у себя на диске.

    В будущем я хотел бы попробовать сделать так, чтобы база была на каком-то сервере, чтобы многие могли пользоваться приложением, но не думаю, что это будет нормально работать, да и вообще не красиво( Заранее спасибо.

    Если ты хочешь, чтобы разные пользователи имели доступ к единой базе модов, то действительно надо сделать какой-то сервер.

    Ну и клиент на WPF не должен напрямую подключаться к MS SQL.
    MS SQL должен находится где-то на сервере и спрятан за каким-то другим web-сервером (который будет написан с использованием ASP NET Core например), который будет уже отвечать за всякую логику.
    Если тебе нужна локальная база данных на клиенте (для кэша например), то лучше использовать sqlite.
    Ответ написан
    2 комментария
  • Не отправляет письмо на @gmail.com когда устанавливаешь ее на хостинг nic.ru. Только на @yandex.ru. Как исправить?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    С большой вероятностью хостер блокирует отправку почты.
    Используйте не функцию mail, а отправку через SMTP-сервер библиотекой PHPMailer.
    Ответ написан
    3 комментария
  • Как отправить запрос с конкретной формы и передать ID или Class формы в PHP-скрипт через ajax-запрос?

    Mike_Ro
    @Mike_Ro Куратор тега JavaScript
    Python, JS, WordPress, SEO, Bots, Adversting
    Как нужно вызывать js-функцию, чтобы она брала данные с той формы которую отправили? И как передать через ajax или ID, или Class формы?

    Модифицировать кнопку форм, чтобы она вызывала событие формы submit:
    <button type="submit" class="button">Отправить</button>

    Создадим один обработчик для всех форм:
    async function sendForm(form) {
      const data = {
        name: form.querySelector("input[name='name']").value,
        email: form.querySelector("input[name='email']").value,
        phone: form.querySelector("input[name='phone']").value,
        message: form.querySelector("textarea[name='message']").value,
        formId: form.id,
        formClass: form.className
      }
    
      try {
        const response = await fetch('php/send.php', {
          method: 'POST',
          headers: {'Content-Type': 'application/json'},
          body: JSON.stringify(data)
        });
    
        if(response.ok) {console.log('Success send form')}
        else console.log('Error send form', response);
      }
    
      catch(error) {console.log('Error: ' + error.message)}
    }

    Вешаем слушателей на submit форм:
    document.querySelector('#form1').addEventListener('submit', (e) => {
      e.preventDefault();
      sendForm(event.target);
    });
    
    document.querySelector('#form2').addEventListener('submit', (e) => {
      e.preventDefault();
      sendForm(event.target);
    });

    В зависимости от формы нужно в PHP-скрипте менять тему письма.

    В php обработчике формы обрабатываем полученные данные от js (php у меня не очень):
    $json = file_get_contents("php://input");
    $data = json_decode($jsonData, true);
    
    // get formId and formClass
    $id = $data['formId'];
    $class = $data['formClass'];
    
    // this change type email message
    Ответ написан
    4 комментария
  • Как размещать тестовый сайт с публичным доступом?

    @Drno
    Вы не попадаете под действие этого закона, если не сдаете свои мощности в аренду.
    Если сайты тестовые и размещаются вами просто в общий доступ - это не хостинг
    Ответ написан
    Комментировать
  • Как сделать свой телефон?

    trapwalker
    @trapwalker
    Программист, энтузиаст
    Так не бывает.
    Нельзя сделать что-то в одном экземпляре бюджетным.
    бОльшая часть стоимости смартфона (а именно о нём, как я понял, речь, раз уж упомянут Андроид), составляет инженерная разработка. Профессиональная деятльность специалистов стоит дорого и окупается только большими партиями конечных устройств.
    Очень наивно полагать, что вы соберёте что-то хотя бы отдалённо похожее на заводской смартфон самостоятельно, и это будет дешевле заводского варианта.
    Поясню на примере. Без всякого андроида если собрать простейшую звонилку на модуле SIM800 и ардуинке, вы вылезете сильно (в разы) за пределы стоимости аналогичного по функциональности бабушкофона. Просто потому что сам модуль стоит как простейшая готовая звонилка с экраном, цветным экранчиком и корпусом в разумном по рамеру форм-факторе без торчащих проводов и не пол кило весом.
    Чтобы сделать смартфон с андроидом их готовых компонентов, вам придётся либо собирать все модули крупноблочно (блютус, вайфай, GSM из дорогих и некомпактных блоков, либо проектировать и разводить плату, что на несколько порядков сложнее и, судя по вашему вопросу, просто невозможно для вашего уровня.

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

    Проще этот принцип масштаба почувствовать на спичках. Попробуйте сделать самостоятельно коробок спичек, чтобы он был дешевле заводского. Если получится, то вы обогатитесь.
    Ответ написан
    Комментировать
  • Как переписать код c jquery на js?

    delphinpro
    @delphinpro Куратор тега JavaScript
    frontend developer
    Ответ написан
    Комментировать
  • Производительность решения SQL like vs join?

    ipatiev
    @ipatiev
    Потомок старинного рода Ипатьевых-Колотитьевых
    Это у вас, похоже, не опции, а свойства в неограниченном количестве.
    Если бы это были опции, то можно было бы или добавить просто колонки в основную таблицу, либо сделать одну колонку с битовой маской

    А свойства хранить либо в EAV, который у вас второй вариант, либо в JSON поле.
    И искать по ним отдельным не вот этим вот, а отдельным сервисом типа Эластика.

    В любом случае, первый вариант, понятное дело, это вообще не вариант
    Ответ написан
    Комментировать
  • Возможно ли отправить в бд через sql запрос в формате BLOB, heic изображения?

    @aleksejjjjj
    Самое отвратительное из известных решений. В БД храним путь к файлу и любые мета данные. Файл лежит в файловой системе. Там его и конвертируем в любой удобный формат и разрешение. Никаких полумер. Картинкам в БД не место.
    Ответ написан
    3 комментария
  • Как сделать дополнительную выборку записей?

    @Akina
    Сетевой и системный админ, SQL-программист.
    WITH 
    cte AS (
        SELECT * , 
               ROW_NUMBER() OVER (ORDER BY `date` DESC, id DESC) rn, 
               DENSE_RANK() OVER (ORDER BY `date` DESC, id DESC) dr
        FROM `list` 
        WHERE user='1' 
        )
    SELECT *
    FROM cte
    WHERE dr <= (
        SELECT dr
        FROM cte
        WHERE rn = 25
        )

    Версия сервера: 5.6.51 - MySQL Community Server (GPL)

    SELECT *
    FROM `list`
    WHERE user='1' 
      AND `date` >= (
        SELECT `date`
        FROM 'list'
        WHERE user='1' 
        ORDER BY `date` DESC, id DESC LIMIT 24, 1
    )
    Ответ написан
    4 комментария
  • Как получить максимальное значение ключа в JSON?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Развернуть JSON в таблицу через JSON_TABLE().
    Потом обнаружить, что запрос работает медленно, найти того, кто записал активно используемые поля в JSON и заставить его переделать на нормальную таблицу.
    Ответ написан
    4 комментария
  • Как правильно выбрать фреймворк и яп для проекта, если ты заказчик?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Никак. Выбор инструмента - это задача тимлида и/или техлида. Т.е. ведущего/главного разработчика, отвечающего за принятие ключевых технических решений. Ваша задача, как заказчика, четко оформить требования, ограничения и сформировать начальное ТЗ и описание, что вам требуется от проекта, прототипы интерфейса, например. Без вникания в технические детали. Т.е., "хочу чтобы были фичи такие-то и работил они так-то, ограничения такие-то, требования такие-то". Далее уже задача найти разработчика/команду с большим или достаточным для данного проекта опытом. Далее из начального ТЗ формируется полноценное техническое задание: описывается весь требуемый функционал, рисуется дизайн, прописываются требования, ограничения и прочие хотелки. И на основе ТЗ, тим/тех лид уже подбирает/подбирают наиболее оптимальные и конкретные инструменты и решения, основываясь на собственном опыте и знаниях для конкретно этой задачи. Например, если человек хорошо знает несколько разных инструментов и есть достаточный опыт их использования - он может реализовать проект используя любой из них как одинаково хорошо, так и одинаково плохо. У разных ЯП и фреймворков свои плюсы и минусы. Далее из ТЗ формируется более детальное ЧТЗ и происходит разработка проекта.

    Вот вы говорите:
    Нужно будет выполнять много запросов к БД

    Важная быстрая скорость работы нашего сайта

    Много/быстро это сколько? 100 запросов в час? 1000 в минуту? 1М в секунду? Загрузка страницы за 30/10/1с или даже 100мс? А к какой именно БД? Какая характеристика самих данных и какого типа запросы? На какое количество соединений? В каком регионе? Есть ли там тяжелые или еще какие-то вычисления? Медиа файлы - картинки, видео? Тут очень много нюансов. В идеале следует определиться с конкретными значениями/параметрами и их описать в ТЗ. Ну или определить примерное, а фактическое значение определить на стадии прототипа/MVP и/или провести какое-то исследование/тестирование. Можно потратить десяток лямов на написание крутого кода на го/расте/С++/ассемблере в течении года и все будет летать на простейшем сервере. А можно купить свой сервер за лям (ну, условно, конечно), нанять питонщика или PHP-ника за 300к и он за пару-тройку недель добьется такого же результата. Большинство веб-задач сегодня достаточно просто или с минимальными усилиями решаются абсолютным большинством решений для веба. Да, у всех решений есть свои плюсы и минусы.

    Безопасность от всяческих XSS и SQL атак.

    Вот с этим проще: использовать популярные OpenSource решения, регулярно проводить тесты, нанять отдельно опытного разработчика, красноглазика и пентестера - и тратить на них деньги, пока деньги не кончатся или не будет достигнут необходимый уровень безопасности. Безопасность противоположна удобству, защита отстает на шаг от атак. Риск есть всегда и надо просто быть готовым к последствиям и иметь запасной плат хотя бы в общих чертах.

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

    ipatiev
    @ipatiev Куратор тега PHP
    Потомок старинного рода Ипатьевых-Колотитьевых
    Если у вас задача потребляет CPU по максимуму, то да - распараллеливать её на большее количество процессов, чем имеется в наличии потоков - бессмысленно.
    Но обычно задача по добавлению записи в БД потребляет не слишком много поцессора. А если речь про "парсинг", где процессор 99% времени ждет пакет из сети, распараллеливать можно хоть на десятки процессов.
    Конкретное количество зависит от потребления процессора конкретной задачей.

    Количество потоков не всегда равно количеству ядер, умноженному на два. Надо смотреть на конкретный процессор. Тем более на VPS, где процессор тоже виртуальный.

    Если говорить про конкретный пример, то в идеале конечно надо написать нормальный код, который запишет в БД несчастные 3 тыщи товаров меньше чем за секунду. А заниматься параллелизмом уже когда счет пойдет на сотни тысяч. Тем более что цифра скорее всего взята с потолка. Я много повидал говнокода на своем веку, но такой, чтобы добавление одного товара занимало 30 секунд я даже вообразить себе не могу.

    Единственная загадка - при чем тут "web", если речь идет про CLI. И, если уж говорить про веб, то с какой радости он "однопоточный".
    Ответ написан
    Комментировать