• Update case или два запроса?

    @Joysi75
    Простые запросы проще сопровождать (нежели гроздья WHEN-ов).
    По скорости зависит от наличия одновременных запросов к этой же таблице, с точки зрения блокировок - кол-во их будет одинаковое.
    www.mysql.ru/docs/man/InnoDB_Locks_set.html и т.д.

    P.S. Подвопрос:
    ELSE text <--дополнительный вопрос-- это же не обязательно, зачем тогда так делать?
    Это во многих SQL серверах так(например, в Oracle) - анализатор не знает значений полей, участвующих в условиях When, потому ветка ELSE хотя и не обязательна, но может возникнуть RUNTIME ошибка при оптимизации запроса для выполнения.
    Ответ написан
  • Как сгенерировать 14-ти значное положительное число?

    @Joysi75
    Если нужны длинные (допустим 100-значные), то можно затратно так (пример для 14 значного):
    BigInteger b;
    do{
           b = new BigInteger(48, new SecureRandom());
    } while (b.toString().length()!=14);
    System.out.println(b.toString());
    Ответ написан
  • В какой книге по java больше практических задач и примеров?

    @Joysi75
    Мне кажется для новичка в плане практических задач лучше проявит "комбо" книга (теория) + онлайн-курс(выдержки из теории + практика):
    hexlet/javarush (рус) pluralsight (engl) ... много их платных и бесплатных. Уделите пару часов на ознакомление.

    P.S. Чисто разбор листингов по книгам без "щупания руками" - эффективность будет ниже. Ну или можно себе несложные задачи придумывать и решать (но для совсем новичка тяжело будет, но преодолимо, особенно если рядом есть кому помочь).
    Ответ написан
  • Что почитать про программирование 3D графики?

    @Joysi75
    Если с точки зрения программирования + математики + базовые алгоритмы (Гуро, Брезенхем, Фонг ...) то до сих пор актуальна Шикин Боресков компьютерная графика (pdf варианты в гугле легко ищутся). Если дружите с C++ - то вообще все шоколадно с этой книгой будет.
    А как там подан рейтресинг... Всевозможные источники света, разные модели отражения-преломления, процедурные текстуры, имитация модели камеры с фокусом, метод излучательности.

    Я вспоминаю студенческие годы, когда запивая аля французский длинный багет колой часть кода переводил на ASM + моделировал текстуры + карты сортов деревьев :-) Помню, как меня заставляли насильно выключать комп на ночь (+я умолял чтобы электрика ночью не сбойнула) , в то время когда самописная прога на Watcom C++ считала покадрово вращение шаров из разных материалов над зеркальной плоскостью .

    Да, четверть книги в данный момент неактуальна ( там где программирование ранних моделей видеокарт EGA/VGA/VESA ... + описание нового для тех времен пакета 3D Studio под DOS), Но оставшиеся 3/4 читаются на ура, формулы и описания весьма понятны, а C/C++ код краток, прозрачен и снабжен необходимыми комментариями.
    Ответ написан
  • Как сделать INSERT OR UPDATE?

    @Joysi75
    Выполнять с 2мя командами в СУБД.
    1) перед вашей операцией выполнить select * from table where age=X and name=Y
    2) Далее, если вернет пустой набор - делать insert
    если есть записи(ь) (не знаю, по логике возможны несколько записей или нет по одному возрасту и имени) -делать разбор возвращенного type и далее выполнить или нет необходимый update.

    Я не знаю возможностей sqlite - может в нем можно хранимую процедуру сделать, где всю логику реализовать внутри и вызывать ее с параметрами.
    Ответ написан
  • Многопоточность и MySQL?

    @Joysi75
    А в чем проблема?
    Базу данных проблемы использующих ее приложений не волнуют. Она в порядке очереди будет обрабатывать поступающие запросы и выполнять их. При выполнении операций модификаций будет блокировать таблицу на изменение. Если будут параллельные запросы к данному ресурсу - положит их в очередь до завершение блокирующих операций, если параллельный запрос к незаблокированному ресурсу - запустит его выполнение не дожидаясь результатов предыдущих.

    У вас таблица с identity. И одновременно поступило пятьсот insert-ов. Все они встанут в очередь. И будут отработаны (будут выполнены или нет из-за некорректности данных). Единственное но, если одно приложение послало подряд не в транзакции два insert-а, никто не гарантирует что у них idenitity поля после вставки будут отличаться на единицу.

    И не стоит реализовывать в клиентской программе логику, например:
    вы вставили значение в таблицу c identity ключом, получили его на клиенте и по привычке однопользовательской БД решили получить количество записей в таблице как значение idenity поля (при условии что данные из нее вы не удаляете) для дальнейших действий. Вот тут может не прокатить, так как между последней ВАШЕЙ операцией Insert может кто-то еще вставить данные и вы не учтете их в логике приложения.

    P.S.
    Также помните, если вам надо выполнить в базе данных подряд несколько логически связанных операций , то оформите их как транзакцию - логический неделимый блок операций. При этом операции будут выполнены подряд последовательно, результат будет:
    -отражен в БД данных при условии , что все операции выполнены корректно
    -полностью отменен и БД восстановит состояние, в котором она была до выполнения первой операции в транзакции при условии, что какое либо действие в транзакции не исполнилось.
    Ответ написан
  • SELECT с неизвестной заранее вложенностью?

    @Joysi75
    Критично применение mysql ? В некоторых СУБД есть типы для хранения древовидных структур.
    Например MSSQL (express версия free) - https://msdn.microsoft.com/en-us/library/bb677290.aspx
    или обзорно тут https://habrahabr.ru/post/27774/
    Ответ написан
  • Как составить запрос MySQL?

    @Joysi75
    Мало входных данных в части хранения SQL.
    Если, например, организовать вашу структуру как список таблиц (id - первичные ключи):
    vegetables(id, name) овощи. Записи в таблице:(1, 'картофель')
    points(id, name) пункты перевозок. Записи в таблице: (1, 'Минск'), (2, 'Москва'), (3, 'Пермь'), (4, 'Тюмень')
    deliveries(vegetable, route, name). Записи в таблице: (1, 1, 'Поставка картошки из Белоруссии N 120'). Поля имеют внешние ключи на vegetables и routes
    routes (id, StartPoint, StopPoint). Записи в таблице: (1, 1, 4). Поля имеют внешние ключи на points
    pathes(route,fromPoint, toPoint). Записи в таблице: (1,1,2) , (1,2,3) (1,3,4). Поля имеют внешние ключи на points и routes.

    select  distinct vegetables.name 
      from vegetables, deliveries, routes, pathes
      where 
        deliveries.vegetable = vegetables.id and
        routes.id=deliveries.route and
        pathes.route=deliveries.route and
       exists (
          select * from pathes, points 
             where pathes.route=route.id and 
                from pathes.fromPoint=points.id and points.Name='Москва') and
       exists (
          select * from pathes, points 
             where pathes.route=route.id and 
                from pathes.toPoint=points.id and points.Name='Тюмень')

    выдаст овощи, у которых есть поставка, пролегающая через 2 указанных города .

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

    @Joysi75
    Если комп отключен, то такой таймер по записи в файл не сработает. Наверное, проще арендовать самый дешевый вирт хостинг и запустить скрипт, который в нужное время оповестить (пошлет на порт "весточку", емыл или еще как).
    Хотя можем мы и не так понимаем, вопрос весьма размыт.
    P.S. Раньше (наверное и сейчас - не интересовался) были платы расширения для материнской платы в некоторые сервера с Ethernet+RS232 набортным контроллером, которые включали их либо по таймеру, либо по спец UDP пакету, посланному на порт.
    Ответ написан
  • Что в себя должна включать поддержка ПО и сколько за это брать денег?

    @Joysi75
    Не зная софта тяжело сказать что и как требуется. Но обычно:
    1. Гарантийные обязательства обычно включают в себя:
    - Указание срока его предоставления.
    - Исправление критических ошибок
    - Консультирование клиента в рамках функционирования ПО (отдельно можно описать круг тем).
    - Обновлении версий
    - Функционирование ПО в рамках обязательств заключенных в договоре (или приложении ТЗ к нему) или указанных в акте (или иных договоренностей) на момент сдачи ПО.
    - Иное обслуживание ранее указанное в договоре/акте/... на момент сдачи ПО. Например, Вы договорились что у клиента ориентировочно через 3 мес откроется пару филиалов и Вы настроете ПО на работу с ним.

    2. Поддержка может включать в себя обычно: техническое обслуживание, аварийное обслуживание, обучение.

    2.1 Аварийное обслуживание. Заранее прописывают 2 вещи: категорию аварии и время реагирования/время устранения + штрафы(не обязательно финансовые, может быть разрыв договора) в случаи нарушения. Например,
    1я категория - не запускается софт (например из-за установки service pack на ОС) время реагирования=30 минут, время устранения=3 часа.
    3я категория - криво сформировался ежегодный отчет (в следствие нарушения данных и т.п.) . Время реагирования=1 час, время устранения=5 раб. дней.

    2.2 Техническое обслуживание. Обычно тут "хотелки" (написать небольшой дополнительный функционал, например, добавить ИТОГО,графики + доп колонки в какой-либо отчет) либо доп. требования (например, выгрузка каких-либо данных для налоговой из инет-магазина при изменении законодательства). В договоре опять-же категоризируют такие работы (например: установка дополнительного АРМ, экспорт-импорт данных в XML/JSON/TXT в стороннее ПО ...) и устанавливают доп цены на них принципу:
    N штук таких работ выставляют в виде периодической абонплаты, а выше N - по отдельной цене (например, за фиксированную почасовую оплату). Будет хорошо, если вы приложите расценки с указаниям кол-ва часов для решения наиболее возникающих проблем. Также указывают штрафы при нарушении сроков и т.п.

    2.3. Обучение. Обычно после сдачи софта разработчик берется:
    - Обучить N сотрудников работе с ним в течении X дней.
    - При изменении версии (или критическом обновлении) произвести обучении M сотрудникам в течении Y дней.
    - Периодически проводить семинары для Z сотрудников не реже S дней в квартал
    Все что за пределами этого (и не входит в гарантийные обязательства) - прописывается и категоризируется. Отдельно прописываются права третьих лиц за отдельные виды работ (например, возможность нанимать внештатных инженеров).

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

    @Joysi75 Автор вопроса
    Вот еще нашел (как ее я раньше пропустил) -
    Выбор по Тьюрингу Г. Гарриссона.
    Ответ написан
  • Как задать необязательные параметры в mysql?

    @Joysi75
    1. Что мешает перед запросом проверить наличие параметра через if (или еще как) и в зависимости от наличия построить необходимый запрос ?
    2. Если только через SQL-выражение без применения if и т.п. и поле f1 в таблице строковое можно в запросе select * from t1 where ... and f1 like '%param%'
    3. Если поле f1 в таблице числовое то можно сколхозить через select * from t1 where ... and f1>=ifnull(param,минимально возможное значение столбца)

    и т.п. с другими типами
    Но во избежание ненужной загрузки для СУБД лучше строить правильный запрос.
    Ответ написан
  • Выбрать из таблицы MySQL по одинаковым значениям полей. Как лучше?

    @Joysi75
    Полностью согласен с Rsa97. Но если нельзя менять структуру БД и нормализовать ее, то ищите по вхождению подстроки в строку:
    1)
    select * from table where instr ( concat(';',addr,';'),';Москва;') > 0

    2)
    select * from table where instr ( concat(';',lang,';'),';рус;') > 0

    3)
    select * from table where instr ( concat(';',times,';'),';пт;') > 0

    и т.д. ';' обнесены, чтобы исключить например попадания Нью-Йорк вместо Йорк и т.п.
    Но все это жутко(даже бешено) неправильно по структуре и сильно увеличивает шанс хранения ошибочных данных и т.п.
    1) Переименуйте поля (addr -> city, times -> dayofweek и т.п.).
    2) Создайте таблицы справочники и сделайте внешний ключ на них
    3) Используйте правильный тип строки (очень плохо хранить все в текстовом виде, особенно ограниченные множества.)
    Ответ написан
  • Зачем нужны матрицы в Direct3D?

    @Joysi75
    Число, вектор и матрица - это все массивы. Просто размерности разные. Матрица по сути можно представить как двумерный вектор (двумерный массив). Конечные матрицы естественно можно заменить векторами (одномерными массивами) - например, матрица 3х3 заменяется вектором из 9-ти элементов. Но со временем, оперировать матрицами Вы привыкнете и они будут для Вас нагляднее.

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

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

    Например, habrahabr.ru/post/131931
    Ответ написан
  • Как правильно проводить "раскопки" сложной структуры БД на крупном проекте?

    @Joysi75
    • 1. Сделайте копию для тестовой базы (или баз) и "копайте в ней"
    • 2. Составьте схему объектов и субъектов СУБД :
      • дерево таблиц и внешних ключей между ними
      • представления (view) и их построение
      • хранимых процедур/функций (укажите с какими таблицами работают)
      • триггеров (на какие таблицы и пр и каких действиях действуют)
      • периодических работ (job-ы и т.п.) - с какими объектами работают и что делают.
      • права и пользователи (кому и что доступно в БД).
      • внешние источники (файлы, импорт/экспорт).
      • и т.п.

    • 3. Найдите монитор запросов (tracer текущих запросов к БД или хотя бы анализатор логов).
    • 4. Настройте проект на работу с данной тестовой СУБД,
    • 5. Начните со справочников (обычно таблицы на которые имеются внешние ссылки и имеющие обычно простую структуру по типу id и name ). Например, справочник групп товаров. Измените через интерфейс наименование, добавьте новое, удалите его. Смотрите какие запросы возникают, какие триггеры отрабатывают (возможно, но маловероятно вызываются хранимые процедуры - проанализируйте и их вызовы) - таким образом выделите в схеме СУБД таблицы справочники и назначение их полей.
    • 6. Далее приступайте ко сложным объектом. Схема та же (но результат может быть отражен на большем количестве объектов СУБД) - выполняете основные действия (например, добавить товары в корзину и т.п.) -> ловите возникающие с ними действия к СУБД (команды, вызов процедур и т.п.) -> отслеживаете изменения СУБД -> документируете объекты и их составляющие (например, таблицы и их поля)
    • 7. Попробуйте выполнить отчеты через интерфейс (если есть). Анализируйте команды к СУБД для их построения аналогично шагам 6-7.
    • 8. Надеюсь к этому шагу часть вопросов по схеме СУБД снимется.
    • 9. Очень рекомендую во время наименьшей нагрузки периодически (например, раз в сутки в полночь) делать копию боевой СУБД и разворачивать ее на тестовой для дальнейшего изучения и экспериментов.

    P.S. При анализе используйте названия таблиц и полей на предмет повторяемости. Например, изучаете работу с клиентом и таблица имеет название User. Поищите среди всех таблиц те, которые имеют поле User и анализируйте их назначение и т.п.
    Ответ написан
  • Как правильнее сделать выборку и построения графа рефераллов?

    @Joysi75
    MySQL обязательно использовать? Нет возможности сменить его на Postgres (или другие СУБД где есть рекурсивные запросы - Oracle/MSSQL/DB2)?

    Есть или нет готовые библиотеки для отрисовки из СУБД не знаю. Но возможно получить из таблицы пути для построения дерева. Если устроит то следующим образом.
    (К сожалению под рукой нет postgresql,) запрос примерно такой:
    WITH 
        RECURSIVE search_graph(id, ref_id) AS
        (
            SELECT id, ref_id
            FROM Users
            UNION ALL
            SELECT o.id, o.ref_id
            FROM Users o
        JOIN search_graph p ON p.ref_id = o.id
        )
        SELECT array_agg(id || ' -> ' ) AS "path"
        FROM search_graph
        GROUP BY id
        ORDER BY id
    ;

    Должен выдать:
    1 ->
    2 -> 1 ->
    3 -> 1 ->
    4 -> 1 ->
    5 -> 4 -> 1 ->

    Последний '->' можно при необходимости убрать через substring(str, from 1 for (length(str)-4))

    P.S. С MySQL форками и последними версиями не работал - может и появились рекурсивные запросы - не знаю. Или возможно через хранимую процедуру/функцию сделать аналог.
    Ответ написан
  • Насколько допустимы запросы без LIMIT?

    @Joysi75
    Плюсы использования limit:
    1) Ограничение и предсказуемость кол-во результирующих строк со стороны сервера,
    2) Меньше нагрузка на сеть,
    3) Проще проектировать GUI выдавая результат запроса "пачками" с определенным количеством строк.
    4) Подсказка для оптимизатора запросов, что приведет к увеличению производительности выборки со стороны сервера

    Минусы использования limit:
    1) Можно сломать логику и/или пропустить ошибку. Допустим в таблице справочника отсутствует primary key и задублировалась запись. Применяя выборки с limit 1 - не поймаете данную ошибку.
    2) Отсутствует в стандарте SQL до 2011.
    3) Не стандартизирован в SQL92. Многие СУБД имеют аналоги (top - MSSQL, Offset - вроде в Postgres; или, еще хуже - конструкции с where rownum = в Oracle ). То есть меняя версию СУБД Вам, возможно, придется переписать все подобного рода запросы.

    P.S. Такого рода споры о целесообразности применения конструкций СУБД необходимо решать с 2х точек зрения СУБД и Приложения. Уверены, что у Вас 99.999999% нет ошибок в реализации объектов СУБД и не планируете переходить на другие СУБД - применяйте limit, иначе задумайтесь.
    P.S.S. Аналогичен спор и о необходимости Order by. Серверные люди скажут, что order by - баловство, не стоит нагружать сервер задачами сортировки полученных данных - это "крестьянское" дело должно ложиться на плечи приложения :)
    Ответ написан
  • Выбрать друзей из таблицы?

    @Joysi75
    Примерно так (если понял вопрос), вместо 5 - нужное значение (подправил, после замечания автора топика):
    select t2.* from table1 t1,table1 t2 
      where 
         t1.from_user_id=t2.to_user_id and 
         t2.from_user_id=t1.to_user_id and 
         t1.from_user_id=5
    Ответ написан
  • Множественные объединения c условием?

    @Joysi75
    По моему все можно :-) ибо
    Я бы делал через subquery (удобно для выборок по разным условиям из составленного "набора" пересечений)
    select BSproduct from
      ( -- Список продуктов имеющих черный цвет и малый размер
        select product as BSProduct from
          (
            SELECT  t1.id,  t1.name AS product,  t3.name AS color,  t5.name AS size
              FROM  `product` AS t1
              JOIN `product_color` AS t2 ON t1.id = t2.product_id
              JOIN `color` AS t3 ON t2.color_id = t3.id
              JOIN `product_size` AS t4 ON t1.id = t4.product_id
              JOIN `size` AS t5 ON t4.size_id = t5.id
          ) 
        where color = "black" and size = "S"  
      ) as BlackAndSmallSize, 
      ( -- Список продуктов имеющих черный цвет и средний размер
        select product as BMProduct from
          (
            SELECT  t1.id,  t1.name AS product,  t3.name AS color,  t5.name AS size
              FROM  `product` AS t1
              JOIN `product_color` AS t2 ON t1.id = t2.product_id
              JOIN `color` AS t3 ON t2.color_id = t3.id
              JOIN `product_size` AS t4 ON t1.id = t4.product_id
              JOIN `size` AS t5 ON t4.size_id = t5.id
          ) 
        where color = "black" and size = "M"  
      ) as BlackAndMidSize, 
      ( -- Список продуктов имеющих большой размер
        select product as LProduct from
          (
            SELECT  t1.id,  t1.name AS product,  t3.name AS color,  t5.name AS size
              FROM  `product` AS t1
              JOIN `product_color` AS t2 ON t1.id = t2.product_id
              JOIN `color` AS t3 ON t2.color_id = t3.id
              JOIN `product_size` AS t4 ON t1.id = t4.product_id
              JOIN `size` AS t5 ON t4.size_id = t5.id
          ) 
        where size = "L"  
      ) as LargeSize
    where BSProduct=BMProduct and BMProduct=LProduct


    Не знаю как насчет MySQL и его форков, в некоторых SQL серверах можно заранее задавать подзапросы типа
    (
            SELECT  t1.id,  t1.name AS product,  t3.name AS color,  t5.name AS size
              FROM  `product` AS t1
              JOIN `product_color` AS t2 ON t1.id = t2.product_id
              JOIN `color` AS t3 ON t2.color_id = t3.id
              JOIN `product_size` AS t4 ON t1.id = t4.product_id
              JOIN `size` AS t5 ON t4.size_id = t5.id
          )

    с помощью команды WITH - тогда объем текста выборки сократится в разы.
    Ответ написан