Cualquiera que sea la mejor solución depende en mi humilde opinión de más que solo la tabla, sino también cómo se utiliza en otra parte de la aplicación.
Suponiendo que todos los comentarios están asociados con algún otro objeto, digamos que extrae todos los comentarios de ese objeto. En su diseño propuesto, extraer todos los comentarios requiere seleccionar de una sola tabla, que es eficiente. Pero eso es extraer los comentarios sin extraer la información sobre el póster de cada comentario. Quizás no quieras mostrarlo, o tal vez ya estén en la memoria.
Pero, ¿y si tuvieras que recuperar información sobre el póster mientras recuperas los comentarios? Luego tiene que unirse a dos tablas diferentes, y ahora el conjunto de registros resultante se está contaminando con una gran cantidad de valores NULL (para un comentario de perfil, todos los campos de usuario serán NULL). El código que tiene que analizar este conjunto de resultados también podría volverse más complejo.
En lo personal, yo probablemente comenzar con la versión totalmente normalizado, y luego desnormalizar cuando empiece a ver los problemas de rendimiento
También hay una solución completamente diferente posible al problema, pero esto depende de si es o no hace sentido en el dominio. ¿Qué pasa si hay otros lugares en la aplicación donde un usuario y un póster se pueden usar de manera intercambiable? ¿Qué pasa si un usuario es solo un tipo especial de perfil? Entonces creo que la solución debería resolverse generalmente en las tablas de usuario/perfil.Por ejemplo (algunos abreviados pseudo-SQL):
create table AbstractProfile (ID primary key, type) -- type can be 'user' or 'profile'
create table User(ProfileID primary key references AbstractProfile , ...)
create table Profile(ProfileID primary key references AbstractProfile , ...)
Entonces, cualquier lugar en su aplicación, donde un usuario o un perfil se pueden utilizar indistintamente, puede hacer referencia al LoginID.
+ 1 para la técnica correctamente normalizada – DancesWithBamboo
Me gusta esta solución, pero hacer un simple filtrado de los comentarios por comentarista o tipo de comentarista requeriría una unión. – cherouvim
De hecho, pero una unión es una pequeña desventaja, y siempre es posible crear una vista o un procedimiento almacenado para esto, por lo que no tiene que pensar en las uniones cada vez que necesite obtener esos datos. – becquerel