Как правильно организовать структуру таблицы MySQL?
=====================================================

 Доброго времени суток!  
  

У меня сложилась немного странная ситуация. Мне нужно правильно организовать структуру бд, но я кажется иду по не верному пути.  

Есть у меня таблицы: user\_emp (работники), user\_oper (операторы), user\_clients (клиенты). То есть как вы уже догадались, это пользователи. У каждого пользователя, схожий набор данных - логин, пароль, телефон и тд.   
**1. Вопрос правильно ли такая структура, когда у разного типа пользователей разные таблицы?** Или же, все таки стоит их просто разделить ролями, но хранить в одной таблице?  
**2. В MySQL есть связи между таблицами, стоит ли хранить например, телефоны юзеров в отдельной таблице "phone\_numbers" и по id их связывать с главной таблицей юзеров?** 

 При имеющихся вводных, оптимальной была бы структура вида:  
  
* users - пользователи
* users\_roles - роли пользователей
* roles - справочник ролей

  

Если у пользователя может быть только 1 роль - тогда можно обойтись 2 таблицами, при этом в таблице users добавить ссылку на role\_id.  
  

Если планируете хранить только телефоны - то опять же, имеет смысл писать его в основную таблицу users. Если в дальнейшем планируется расширение типов контактов и/или их множественность - то будет иметь смысл вынести все в таблицу users\_contacts. 

 1. Стоит объединить таблицы. Иначе, по-первых, возникнут проблемы с foreign key. Например, вы заходите сделать таблицу operations\_history с ключом на пользователя, но не сможете, поскольку пользователи разбиты. Во-вторых, все равно потом появятся запросы по всем пользователям. Например, вам точно рано или поздно захочется найти юзера по имени, и делать это по трём таблицам будет запарно. В-третьих, потом еще появятся менеджеры, контрагенты... Будете плодить таблицы?  

2. Тут вопрос только в производительности. Вынос поля в отдельную таблицу ускорит выборку, когда это поле не используется, и замедлит, когда используется. Я обычно делаю одну дополнительную таблицу, т. е. не phone\_numbers, а user\_meta\_info, куда пишу номера телефона, года рождения и другую инфу, которая нужна только для отображения, но не фигурирует в логике системы. А имя, группу и другие данные, которые нужны почти всегда когда используется сущность user, кладу в основную таблицу. 

> все таки стоит их просто разделить ролями, но хранить в одной таблице?

  

Иначе говоря, не денормализовывайте данные (не дробите их).  
  

> В MySQL есть связи между таблицами, стоит ли хранить например, телефоны юзеров в отдельной таблице "phone\_numbers" и по id их связывать с главной таблицей юзеров?

  

Стоит, если у Вас действительно большой объём данных, сервер не справляется а телефони пр. параметры - запрашиваются относительно редко по сравнинию кол-вом запросов в таблицу пользователей. В этом случае, все редко используемые данные выносят в отдельную таблицу, что бы физически разделить их на диске и уменьшить объём основной таблице. При этом, данные из доп. таблицы получают отдельным запросом (без JOIN'ов). А вообще, когда такое случается (когда данных уже столько, что массив дисковый массив захлёбывается и данные приходятся дробить, индексы перестают работать нормально а внешние ключи сыпятся) - уже пора переходить на Postgresql, а не мучить MySQL, которая тихи и мирно начинает скатываться в "черную дыру непонятных ошибок"...