Задать вопрос
  • Как лучше (дешевле) хранить справочники?

    vyachin, Вы меня не полностью читали, я уже писал, что
    Конвертировать строку в любой тип на программном уровне вообще без проблем!
    и
    Какие запросы мы делаем к справочнику? Получить значение по ключу и/или по ИД, обратных запросов вообще практически нет.

    И да, отступаем от первой нормали, что в этом плохого?

    PS. Реляционные базы отложил, лет эдак 10 назад после лет эдак 10 непрерывного использования. И последние лет эдак 10 занимаюсь noSQL и не только, а учебников тогда еще не было. И да, я старый хрен, для кого-то почти старик, но девочки западают, челюсть не висит!
  • Как лучше (дешевле) хранить справочники?

    vyachin, давайте немного остановимся
    1) я говорил совсем не о конкретной реализации, а о принципе хранения, что и вопрошал автор вопроса!
    2) как приблизительный пример привел на скорую руку (!!!) первое, что пришло в голову и соответствует моей идее.
    3) автор вопроса вообще не дал никаких данных по полям/объектам и прочей фигни, так что разбирать досконально, какие поля должны быть в какой таблице, смысла не вижу.
    4) Вы мне ставите в укор не принцип хранения (смотрим суть вопроса(!)) а пример, к делу совсем не относящийся, приведенный для полноты картины. Не находите странным?

    Ну и если пошла такая дискуссия, вот приблизительная схема, как я ее вижу.

    Таблица характеристик (можно сделать отдельно группировку по группам, добавить доступы, множественные значения и т.д., но здесь это рассматривать совсем не собираюсь)
    PropNames
    prop_id (number) | name (char) | type (char)
    1 | color | string
    2 | weigth | long

    Таблица значений характеристик, связанная с товаром
    PropValues
    product_id (number) | prop_id (number) | value (char)
    1000 | 1 | red
    1000 | 2 | 10.0

    И да, на этом дискуссию завершаю.
  • Как лучше (дешевле) хранить справочники?

    Отвечу просто, я не сторонник городить трехэтажные джоины, я сторонник переносить всю возможную логику на программную сторону. Поэтому всем рекомендую сделать пару (а может и десятка два) лишних запроса, вместо попытки получить все в одном. На то есть ряд проверенных временем и производительностью оснований.
    1) простые запросы легче прожевываются оптимизатором и самой базы, и легче кешируются на стороне базы.
    2) простые запросы легче кешируются на стороне приложения.
    3) любая база данных, если мы говорим про sql, ресурс сильно ограниченный лицензиями, потоками, производительностью сервера, возможностью расширения (и тд), поэтому его крайне нежелательно нагружать триггерами, хранимками, сложными запросами в стиле olap, и прочей чушью. Главная задача базы -обеспечивать консистентность хранимой информации. Дя, я понимаю, что планировщики могут прожевать запрос на 200 таблиц и тыщщу полей с джоинами сабселектами, хранимками по триггерам (а еще это просто красиво), но кому оно нужно, когда пара таких запросов выбивает полностью кеш базы, превращая всю производительность сотен тысяч долларов в тормозного червя.
    4) вычислительную мощность программной части гораздо легче нарастить, как по горизонтали, так и по вертикали. На текущий момент купить еще один сервер/инстанс для бекенда проще на порядок, чем сделать мастер-слев реплику любой базы. В программной части мы практически не ограничены в ресурсах (при хоть немного правильной архитектуре), а вот с базами данных такой фокус желательно закладывать на этапе проектирования! Имея один-два сервера бд, пару кеширующих серверов и с десяток бекендов нам проще выполнить с десяток запросов, четко попадающих в кеши к десятку таблиц, чем городить джоины на сотню.
    5) программный код легче поддерживать, отлаживать и модифицировать, чем бороться с эксплейнами, сбросами кешей базы и отладкой sql,причем мапинг домен-данных будет на порядок проще, как и отладка бизнес-логики на их основе.
    6) нужно генерировать отчеты, берите olap или nosql, и не терзайте то, для чего оно не предназначено.
  • Как лучше (дешевле) хранить справочники?

    d-stream, что такое справочник? Обычно это ключ-значение-тип-ид. Какие запросы мы делаем к справочнику? Получить значение по ключу и/или по ИД, обратных запросов вообще практически нет. Конвертировать строку в любой тип на программном уровне вообще без проблем! Это конечно не касается случаев, когда у нас например счетчики, но тогда это и не справочник.можно конечно сказать, что строка и число занимают совсем разное место. Да можно, но во первых - это таки справочник, во вторых никто нам не запрещает иметь и числовые справочники отдельными таблицами... Но вот отдельная таблица на каждый справочник - я такое у себя не позволю, уж очень серьезные аргументы мне нужно привести, почему нужно на 10-20 значений заводить таблицу! Да, может быть мускул к этому и подталкивает, но вот в сайбейс или какой другой энтерпрай-базе, таблица, не хрен собачий, и иногда на десяток записей жрет места больше них самих.
  • Как лучше (дешевле) хранить справочники?

    Дмитрий Ларин, а вот, кстати, про nosql, настоятельно рекомендую посмотреть на эластиксерч.
  • Как лучше (дешевле) хранить справочники?

    Дмитрий Ларин, у битрикса как раз и беда, что полей дофига и поэтому индексы для поиска построить невозможно, отсюда и каша в базе. Хайлоад блоки хоть как-то улучшают ситуацию только потому, что полностью отданы на откуп разработчику.
    Что же касается больших таблиц, а лучше сказать - с большим количеством записей, то в этом абсолютно ничего страшного нет. Когда писали биллинг, то таблицы за день могли содержать несколько миллионов записей, и ничего, быстро все работало. Главное, правильно все спроектировать. Ну и на мой взгляд, просто крупную таблицу гораздо легче разбить на шарды (по хешу, дате номеру котракта или какому еще признаку), так как они будут все одинаковые по отношению к таблице-родителю. Легче будет разнести на несколько инстансов, легче бекапить и прочее-прочее-прочее. А вот создавать по таблице на каждый чих - самое фиговое занятие, поддерживать это через год уже невозможно в принципе, а с ростом проекта ситуация будет только усугубляться (битрикс привет).
    И это никак не относится к нормализации самой базы и данных в ней.
  • Как лучше (дешевле) хранить справочники?

    vyachin, Дмитрий Ларин,
    Хорошо, ну тогда скажите, где моя маааленькая таблица нарушает хоть какую-то форму нормализации?
    И чем плоха одна таблица?
  • PMP from windows to linux?

    leahch
    @leahch Куратор тега Linux
    Стандартной заметой по тексту это сделать не получится? Или там разные версии?!
  • Как создать многомерный массив n объема в Java?

    Работайте с одномерным, а смещения считайте исходя из размерности.
  • Как консольную программу переделать под оконную с графическим интерфейсом в Java FX?

    Kamio_Mur, И да, код я естественно не отлаживал :-) Посмотреть, где зависает можно и через отладчик.
  • Как консольную программу переделать под оконную с графическим интерфейсом в Java FX?

    Kamio_Mur, Во первых хорошо бы взглянуть на сам код, который Main, fxml и Controller. Нужно смотреть все равно весь код, который получился и нагенерировался.
    Думаю, что дальнейшее обсуждение лучше перенести в skype например, или по email, или задать отдельным вопросом В профиле моем есть контакты, подскажу.
    Есть такое понятие, как архитектура MVC, у Вас похоже не хватает как раз класса, который бы держал М - модель данных. Но опять же, нужно посмотреть в код.
    Или выложите его на https://pastebin.com
  • Как консольную программу переделать под оконную с графическим интерфейсом в Java FX?

    Kamio_Mur, :-) ну, можно как и у Вас, чрез Scanner, если сильно не заморачиваться. Преобразуем строку в InputStream, далее все тоже самое. Это если будем вводить оценки через пробел.
    .....
    String value = valueTextField.getText(); // get filed value
    InputStream stream = new ByteArrayInputStream(value.getBytes(StandardCharsets.UTF_8)); // to stream
    
    Scanner input = new Scanner(System.in);
    /***/
    int x [] = new int[28];        
    // System.out.println("Введите оценки учеников через пробел:");    
    for (int i = 0; i < 28; i++)
          x[i] = input.nextInt();        
    int dva = 0;
    for (int i = 0; i < 28; i++) {
        if (x[i] <= 2) 
              x[i] = dva;
        dva++;
    }
    System.out.println(dva>0 ? " Двойки у " + dva + "       человек" : "Двоек нет!"); }}
    ....


    Можно, и чуть покрасивее сделать... Оценки вводим через пробел...
    String[] values = valueTextField.getText().split(" "); // get filed value and split it by space
    int dva =0;
    for(String str: values) {
       if(Integer.parseInt(str) <= 2) // parse string to int and check
         dva ++;
    }
    System.out.println(dva>0 ? " Двойки у " + dva + "   из " + values.length + "  человек" : "Двоек нет у " + values.length + " человек!");
  • Как консольную программу переделать под оконную с графическим интерфейсом в Java FX?

    Ну и до кучи, тоже самое через ламбды
    ...
    TextField userTextField = new TextField(); // поле ввода user
    ...
    TextField valueTextField = new TextField(); // поле ввода value
    ...
    Button btn = new Button("Sign in"); // кнопка для нажатия
    ....
    
    // далее код нажатия для кнопки
    btn.setOnAction(event -> {
            String user = userTextField.getText();
            String value = valueTextField.getText();
            userTextField.clear(); // почистить поле ввода
            valueTextField.clear(); // почистить поле ввода
            // что-то сделать с полученными значениями user и value
    });

    ЗЫ. код не проверял...
  • Как консольную программу переделать под оконную с графическим интерфейсом в Java FX?

    О, вот, вообще готовая программа, из одного поля ввода и кнопки, с объяснением - https://metanit.com/java/javafx/4.5.php
    Да, здесь кнопка обрабатывается через лямбду, а в моем примере - через анонимный класс.
  • Как консольную программу переделать под оконную с графическим интерфейсом в Java FX?

    Здесь должен быть код, который берет из контролов их текущие значения.

    ...
    TextField userTextField = new TextField(); // поле ввода user
    ...
    TextField valueTextField = new TextField(); // поле ввода value
    ...
    Button btn = new Button("Sign in"); // кнопка для нажатия
    ....
    
    // далее код нажатия для кнопки
    btn.setOnAction(new EventHandler<ActionEvent>() {
     
        @Override
        public void handle(ActionEvent e) {
            String user = userTextField.getText();
            String value = valueTextField.getText();
            userTextField.clear(); // почистить поле ввода
            valueTextField.clear(); // почистить поле ввода
            // что-то сделать с полученными значениями user и value
        }
    });
  • Как спарсить нужный столбец из таблицы (docx)?

    vitHlJT62b7VCE2, Коротко отвечу - хреново! Переводите в эксель и прасите нормально!
  • Зачем ссылку на объект с реализацией интерфейса помещать в переменную типа этого интерфейса?

    Есть куча реализаций интерфейса Set, вам же не важно, какая именно реализация будет? Теперь мы делаем 200 методов, в параметры которого передали Set. Им тоже не важна внутренняя реализация. А теперь, мы плюнули на интерфейс, и вместо Set, прописали конретный класс HashSet в эти 200 методов. Через пол года стали использовать другую реализацию - RemoteSet, и код перестал компилироваться, нужно поменять все 200 методов, а не одно место!
  • Как рассылать письма нескольким пользователям в Spring?

    azerphoenix, да, правильнее итерировать список пользователей. Причем, не все почтовики поддерживают длинный список ресипиентов, ну и CC и BCC тоже не спасут, ино не для этого.
  • Какие преимущества у NoSQL?

    Antony Tkachenko, все относительно. По отдельным полям таблицы в SQL проблем нет, но вот по всему документу сразу (по всем связанным полям нескольких таблиц)?!