Esto es ciertamente una buena idea, ya que está normalizando la base de datos. He hecho un diseño similar en una aplicación que estoy escribiendo, donde tengo una tabla de empleados y una tabla de usuarios. Los usuarios pueden a partir de una empresa externa o un empleado, por lo que tengo tablas separadas porque un empleado siempre es un usuario, pero un usuario no puede ser un empleado.
Los problemas con los que se encontrará es que cada vez que usa la tabla de usuarios, casi siempre querrá que la tabla de personas obtenga el nombre u otros atributos comunes que le gustaría mostrar.
Desde el punto de vista de la codificación, si está utilizando SQL directo, le tomará un poco más de esfuerzo analizar mentalmente la instrucción de selección. Puede ser un poco más complicado si está usando una biblioteca ORM. No tengo suficiente experiencia con esos.
En mi aplicación, lo estoy escribiendo en Ruby on Rails, así que estoy constantemente haciendo cosas como employee.user.name, donde si las mantuviera juntas, sería solo employee.name o user.name .
Desde el punto de vista del rendimiento, está golpeando dos tablas en lugar de una, pero dados los índices adecuados, debería ser insignificante. Si tuvieras un índice que contuviera la clave primaria y el nombre de la persona, por ejemplo, la base de datos golpearía la tabla de usuario, luego el índice de la tabla de personas (con un impacto casi directo), por lo que el rendimiento sería casi el mismo tener una mesa
También podría crear una vista en la base de datos para mantener ambas tablas unidas para brindarle mejoras de rendimiento adicionales. Sé que en las versiones posteriores de Oracle incluso puede poner un índice en una vista si es necesario para aumentar el rendimiento.
Tenga en cuenta que los UUID (GUID en MS land) realmente hacen claves pobres en muchos casos porque su aleatoriedad y tamaño anulan los mecanismos de indexación. Mejor es usar un número entero simple cuando sea posible. –