Это, безусловно, хорошая идея, так как вы нормализуете базу данных. Я сделал аналогичный проект в приложении, которое я пишу, где у меня есть таблица сотрудников и пользовательская таблица. Пользователи могут иметь внешнюю компанию или сотрудника, поэтому у меня есть отдельные таблицы, потому что сотрудник всегда является пользователем, но пользователь не может быть сотрудником.
Проблемы, с которыми вы столкнулись, - это то, что всякий раз, когда вы используете пользовательскую таблицу, вы почти всегда хотите, чтобы таблица людей получала имя или другие общие атрибуты, которые вы хотели бы показать.
С точки зрения кодирования, если вы используете прямой SQL, вам потребуется немного больше усилий, чтобы мысленно разобрать инструкцию select. Это может быть немного сложнее, если вы используете библиотеку ORM. У меня недостаточно опыта.
В моем приложении я пишу его в Ruby on Rails, поэтому я постоянно занимаюсь такими вещами, как employee.user.name, где, если бы я содержал их вместе, это было бы просто employee.name или user.name ,
С точки зрения производительности вы нажимаете две таблицы вместо одной, но при наличии соответствующих индексов она должна быть незначительной. Если у вас есть индекс, содержащий первичный ключ и имя человека, например, база данных попадет в пользовательскую таблицу, тогда индекс для таблицы person (с почти прямым ударом), поэтому производительность будет почти такой же, как есть один стол.
Вы также можете создать представление в базе данных, чтобы обе таблицы были объединены, чтобы дать вам дополнительные улучшения производительности. Я знаю, что в более поздних версиях Oracle вы можете даже поместить индекс в представление, если это необходимо для повышения производительности.
Обратите внимание, что UUID (GUIDs в MS land) на самом деле делают плохие ключи во многих случаях, потому что их случайность и размер ухудшают механизмы индексирования. Лучше всего использовать простое целое число, когда это возможно. – 2010-10-13 17:24:17