Mi amigo y yo estamos construyendo un sitio web y tenemos un gran desacuerdo. El núcleo del sitio es una base de datos de comentarios sobre "personas". Básicamente, las personas pueden ingresar comentarios y pueden ingresar a la persona de quien se trata el comentario. Luego, los espectadores pueden buscar en la base de datos las palabras que están en el comentario o partes del nombre de la persona. Es completamente generado por el usuario. Por ejemplo, si alguien desea publicar un comentario en una versión mal escrita del nombre de una persona, puede hacerlo, y eso está bien. Por lo tanto, puede haber varias ortografías de diferentes personas enumeradas como varias entradas diferentes (algunas con segundo nombre, algunas con apodo, otras mal redactadas, etc.), pero todo está bien. No nos importa si las personas hacen comentarios sobre personas al azar o personas imaginarias.normalización innecesaria
De todos modos, el problema es cómo estamos estructurando la base de datos. En este momento es sólo una mesa con el ID de comentario como la clave principal, y luego hay un campo para la 'persona' el comentario es acerca de:
comentario ID - comentario - persona
1 - "él es raro" - John Smith
2 - "chica huele mal" - Jenny
3 - "gay" - John Smith
4 - "me debe $ 20" - Jennyyyyyyyyy
Todo funciona bien. Usando la base de datos, puedo crear páginas que enumeran todos los 'comentarios' para una 'persona' en particular. Sin embargo, está obsesionado con que la base de datos no esté normalizada. Leí acerca de la normalización y aprendí que estaba equivocado. La tabla ES actualmente normalizada, porque la ID del comentario es única y dicta el 'comentario' y la 'persona'. Ahora él es insistente en que 'la persona' debería tener su PROPIA mesa porque es una 'cosa'. No creo que sea necesario, porque aunque 'persona' realmente es el contenedor más grande (una 'persona' puede tener muchos 'comentarios' sobre ellos), la base de datos parece funcionar bien con 'persona' como un atributo de la identificación del comentario. Utilizo varias llamadas PHP para diferentes selecciones SQL para hacer que parezca mágicamente más sofisticado en la salida y la forma diferente en que el usuario puede buscar y ver los resultados, pero en realidad, la configuración es bastante simple. Ahora estoy permitiendo que los usuarios clasifiquen los comentarios con los pulgares arriba y con los pulgares hacia abajo, y conservo un 'puntaje' como otro campo en la misma tabla.
Creo que actualmente no es necesario tener una tabla separada para las entradas únicas de 'persona' porque las 'personas' no tienen su propia 'puntuación' o ninguno de sus propios atributos. Solo los comentarios lo hacen. Mi amigo es tan insistente que es necesario para la eficiencia. Finalmente dije, "OK, si quieres que cree una tabla separada y que 'persona' sea su propio campo, entonces ¿cuál sería el segundo campo? Porque si una tabla tiene solo una columna, parece inútil. Estoy de acuerdo que luego podemos crear la necesidad de darle a 'persona' su propia mesa, pero podemos ocuparnos de eso entonces ". Luego dijo que las cadenas no pueden ser claves primarias, y que convertiríamos las 'personas' en la tabla actual en números, y los números serían la clave principal en la nueva tabla 'persona'. Para mí, esto parece innecesario y haría que la tabla actual sea más difícil de leer. También piensa que será imposible crear la segunda tabla más adelante, y que debemos anticipar ahora que podríamos necesitarla para algo más adelante.
¿Quién tiene razón?
Estoy de acuerdo con Frankie/su amigo. Hacer este tipo de cambio más tarde, aunque no es imposible, es incómodo y propenso a errores. – Jaydee
¿Alguien puede explicar cómo la creación de una clave sustituta para un atributo que no aparece en el lado izquierdo de cualquier dependencia funcional normaliza una base de datos? Como dijo el OP, la Persona no determina nada (y nunca lo hará). ¿Habría ofrecido el mismo consejo para un atributo llamado 'Cosas'? Puede haber un problema de normalización aquí pero no involucra a la Persona. – NealB
@NealB mi experiencia como docente y la forma en que se formula la pregunta me hacen creer que OP es parcial. El simple hecho de que el campo se llame persona y no texto es, IMO, relevante. – Frankie