То, что у вас есть вместе с обновлением, выглядит примерно так.
Итак, на мой взгляд, у вас есть пользователи, и у каждого пользователя есть основной список контактов.У пользователя также есть дополнительные списки для организации контактов в основном списке.Каждый контакт имеет свое имя и контактную информацию, а также несколько компаний, в которых они работали, плюс они должны отслеживать свою текущую компанию.
Хранение компаний в отдельной таблице было хорошей идеей.Обычно текстовое поле будет работать, но поскольку вы планируете использовать компании больше как отдельные объекты, лучше всего подойдет отдельная таблица.
Мне кажется, что я повторяю то, что у вас есть, но я поставлю то, что кажетсялучшая настройка.Я просто пишу следующее с моими соглашениями (подчеркивание означает один ко многим):
*user*
id [int PK],
...
*user_contact*
id [int PK],
user [int FK (user)],
currentCompany [int FK (company)]
...
*user_contact_company*
id [int PK],
contact [int FK (user_contact)],
company [int FK (company)],
startDate [date],
endDate [date]
...
*user_contactList*
id [int PK],
user [int FK (user)]
...
*user_contactList_contact*
id [int PK],
contactList [int FK (user_contactList)],
contact [int FK (contact)]
...
*company*
id [int PK]
...
Затем для базовой группировки:
SELECT * FROM `user_contact` WHERE `user` = <USER_ID> GROUP BY `currentCompany`
Но я не думаю,это будет работать так, как вы хотите, поэтому у вас может быть два запроса:
SELECT DISTINCT `currentCompany` FROM `user_contact` WHERE `user` = <USER_ID>
Тогда для каждой компании:
SELECT * FROM `user_contact` WHERE `company` = <COMPANY>
Есть много других способов сделать это, в зависимости ото том, как вы планируете это реализовать.Например, вы можете просто сделать ORDER BY, чтобы все компании были сгруппированы, и тогда ваш код, который отображает компании, может увидеть, отличается ли текущая компания от предыдущей, и провести правильное различие.
Что касается позиций компании, вы можете подумать о том, чтобы сделать текст или сослаться на другую таблицу, в зависимости от того, как вы ее используете.Если вы собираетесь выполнять сортировку, например, «Диспетчер проектов» будет сгруппирован с другими «Диспетчерами проектов», то он должен находиться в другой таблице, в противном случае кто-то может выбрать другое имя, нежели «Диспетчер проектов», или сделать имя строчнымдаже если они семантически одинаковы.