За последние 24 часа нас посетили 20217 программистов и 1079 роботов. Сейчас ищут 766 программистов ...

Проектирование БД

Тема в разделе "MySQL", создана пользователем MasterDmx, 20 янв 2017.

  1. MasterDmx

    MasterDmx Активный пользователь

    С нами с:
    17 авг 2014
    Сообщения:
    31
    Симпатии:
    0
    Доброго времени суток, необходимо реализовать таблицу с заявками на различные услуги. К примеру "потребительский кредит", "получение кредитной истории", "кредит для бизнеса".
    Суть в том, что все заявки должны быть в одной таблице с уникальным ID независимо от типа услуги, потому что есть другие таблицы, где используется ID заявки. НО в тоже время для разных типов услуг нужны поля (столбцы), иными словами в потреб. кредит нужно 40 столбцов а для кредитной истории 8.

    Сейчас все хранится в одной таблице с 50-ю столбцами.

    Вопрос: правильный ли такой способ хранения? Ведь для той же услуги кредитной истории нужно всего 10 столбцов, а остальные 30 заполняются пустотой или 0.

    Возникла идея создать много таблиц под услуги и одну результирующую. К примеру "leads" - в ней будет хранится ID, дата получения заявки, услуга. А дальше в зависимости от услуги будет JOIN к таблице этой услуги. Таком образом под каждую услугу будет свой перечень полей (столбцов) и уникальные ID за счет главной таблицы "leads".

    Если нужно вывести только заявки определенной услуги - проблем нет. Обычный джоин. А бывает нужно получить 100 заявок не зависимо от типа, то есть получить все поля, вот тогда придется делать несколько запросов в разные таблицы.

    Посоветуете как быть?
     
  2. acho

    acho Активный пользователь

    С нами с:
    28 дек 2016
    Сообщения:
    854
    Симпатии:
    210
    Адрес:
    Санкт-Петербург
    @MasterDmx, делай так. Несколько запросов (а их у тебя будет ну 3-4, сколько там этих услуг ты написал) - это не панацея. Вот 100 запросов на странице - нехорошо.
     
  3. MasterDmx

    MasterDmx Активный пользователь

    С нами с:
    17 авг 2014
    Сообщения:
    31
    Симпатии:
    0
    Получается связь 1к1, везде где читал про это - ругаются, мол неправильно так делать
     
  4. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    во-первых дофига колонок проблема только для людей, они в них путаются. Программы не путаются. Мускул может доусрачки колонок. Ему ок.

    во-вторых, если чешется и хочется чтобы прям глаз радовало и концептуально красиво то надо завести одну головную таблицу с общими полями типа клиента там, описания. И несколько таблиц под услуги, у которых айдишник будет не инкрементным, а браться из головной таблицы. Я просто не уверен, что правильно понял ваше описание. Если вы именно так хотите, то да, это будет красиво. Только не забывайте про транзакции, блокировки и всё такое.
     
  5. MasterDmx

    MasterDmx Активный пользователь

    С нами с:
    17 авг 2014
    Сообщения:
    31
    Симпатии:
    0
    Не, я как раз не путаюсь, в одной мне удобнее. Но я опасаюсь, что со временем выборки начнут тормозить. Плюс если одна таблица и нужно добавить колонку для какой-то одной услуги, то число пустых полей возрастает, а вызывается то все равно все поля в таблице. Вот я и подумал, что вдруг несколькими запросами будет быстрее чем 1
     
  6. MasterDmx

    MasterDmx Активный пользователь

    С нами с:
    17 авг 2014
    Сообщения:
    31
    Симпатии:
    0
    Еще есть вопрос по реализации структуры lead,field,value. То есть у нас есть база с "общими полями типа клиента". Потом есть база с полями и есть база со значением этих полей "lead_data", где каждая строчка это значение определенного поля. Данный способ рекомендуют, когда число столбцов не фиксированное, то есть не знаешь сколько именно столбцов будет. Но при таком подходе я не могу сообразить как сделать выборку по двум и более полям.
    Вот такой запрос в итоге получается для выборки из одного поля:
    Код (Text):
    1. SELECT id,name FROM leads WHERE id IN (SELECT lead FROM lead_data WHERE field="3" AND value="1" GROUP BY lead)
    В голову приходит только вариант, где под каждое поле придется делать отдельный подзапрос. К примеру field="3" AND value="1" - один подзапрос, field="5" AND value>"1" второй подзапрос и так далее. Так делать не вариант, потому что бывает нужна выборка по 10 полям сразу.

    Может есть другой способ сделать выборку при такой структуре?
     
  7. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.410
    Симпатии:
    1.768
    дожить бы до этого
    --- Добавлено ---
    это капец, не делай так никогда, забей. Так делают все, и это жопа полная.

    Делай несколько таблиц если руки чешутся.
    --- Добавлено ---
    и это только начало.

    Забей. Делай несколько таблиц.