За последние 24 часа нас посетил 21591 программист и 1690 роботов. Сейчас ищут 1876 программистов ...

Как правильно построить БД

Тема в разделе "MySQL", создана пользователем lunberg88, 7 авг 2017.

  1. lunberg88

    lunberg88 Новичок

    С нами с:
    29 июн 2017
    Сообщения:
    13
    Симпатии:
    0
    День добрый.
    Не могу никак правильно спроектировать БД для такой вот задачки:

    Сначала сделал БД с 2мя таблицами: employees(id/fio/position_id/date/slary) & position(id/number/description) и связь для (employee.position_id => position.number) - *многие к одному.
    Но для организации вывода списка смотрю такой подход не годиться... Путаюсь в мыслях, и есть идея сделать ещё 3ю таблицу промежуточную - employee2position (но не знаю какие поля задать).

    Посоветуйте какой подход будет толковым, БД на 2 или 3 таблицы?
    Вернуться к началу
     
  2. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    А в чем сложность вывода списка-то?
     
  3. lunberg88

    lunberg88 Новичок

    С нами с:
    29 июн 2017
    Сообщения:
    13
    Симпатии:
    0
    Ну вот у меня получается вывести все поля кроме поля "начальник"...
     
  4. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Да тебе и не надо выводить начальника. Перечитай требования, которые сам же в первом посте опубликовал. Там упоминается, что у раба может быть только один надзиратель, но при перечислении полей хранения - насяйника уехаланама кудата.
     
  5. Maputo

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

    С нами с:
    30 июл 2015
    Сообщения:
    1.136
    Симпатии:
    173
    @lunberg88, 2 или 3 таблицы выбираются по типу связи. Если Вам удалось организовать связь 1:М, то 3-я таблица не нужна. А если у вас 1 сотрудник может занимать более 1й должности, то это уже связь М:М - тогда нужна промежуточная таблица, где будет сохранена связь между ключами из первой и второй таблицы. Т.е. поля id, employe_id, position_id
    Если в эту таблицу добавить еще два поля - дату вступления в должность и ее освобождение - это уже будет отдельная сущность (период работы). Тогда даже при связи 1:М между первыми двумя таблицами нужно создавать 3ю и разрывать существующую связь.
     
    #5 Maputo, 7 авг 2017
    Последнее редактирование: 7 авг 2017
  6. lunberg88

    lunberg88 Новичок

    С нами с:
    29 июн 2017
    Сообщения:
    13
    Симпатии:
    0
    @Maputo, Нет, у каждого рабочего может быть только один начальник.
    @Ganzal, вот из первого поста:
    В дальнейшем нужно будет сделать страничку с выводом списка сотрудников компании (с полями): фио/должность/дата/оклад/начальник.
     
  7. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Ну так в дальнейшем. Не сейчас же. Давай решать вопросы по мере поступления.
     
  8. lunberg88

    lunberg88 Новичок

    С нами с:
    29 июн 2017
    Сообщения:
    13
    Симпатии:
    0
    Я уже и сам блин запутался, такая каша... Вообщем примерно как условие выглядит:
    Вот исходя из этого списка задач и возник вопрос, какой подход лучше сделать, организовать на 2 или 3 таблицы БД.
     
  9. Ganzal

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

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    2 таблицы вполне хватит
     
  10. lunberg88

    lunberg88 Новичок

    С нами с:
    29 июн 2017
    Сообщения:
    13
    Симпатии:
    0
    Вообщем на SF3 с доктриной(DQL) получилось сделать так:
    PHP:
    1. SELECT e.id, e.fio, e.salary, e.positionId, e.date, p.name, p.parentId, (SELECT ps.name FROM WorkBundle:Position ps WHERE p.parentId = ps.number) as parent FROM WorkBundle:Employee e
    2.                 JOIN WorkBundle:Position p
    3.                 WHERE e.positionId = p.number
    4.                 ORDER BY p.id ASC
    Возможно это не правильно, но пока такой результат и выводит именно как было нужно (то есть в колонке: "начальник" выводит руководящую должность текущей).