¿Por qué una mesa con demasiadas columnas huele mal?

Recientemente tuve esta discusión con algunos otros desarrolladores acerca de cómo demasiadas columnas en una tabla, o demasiados atributos en un modelo es un olor a código. Algunos argumentan que un Modelo con demasiados Atributos está haciendo demasiadas cosas y debería dividirse. Pero, ¿y si el modelo realmente requiere esos atributos?

Permítanme tomar el ejemplo de un users mesa .

Un usuario puede tener first_name , last_name , street_name , city , state , age , etc . De acuerdo con el argumento, supongo street_name , city y state se debe mover a una tabla diferente. Estoy de acuerdo en que los datos relacionados se agrupan de esta manera, pero si la aplicación también consulta al usuario con su dirección, ¿no será una operación más costosa, ya que ahora están en 2 tablas?

Entonces, ¿cuál es la forma correcta de modelar tablas con muchos atributos? (¿Deberíamos considerar también estos casos: cuando 1. el número de filas será menor 2. el número de filas será enorme)

preguntado el 24 de agosto de 12 a las 06:08

probablemente no deberías tienda edad en su base de datos. Todos sus datos se volverán inexactos -

3 Respuestas

No es una cuestión de "demasiados atributos en una tabla". Es una cuestión de "unir los atributos incorrectos en una tabla". La clave de una tabla debe estar relacionada con alguna entidad o relación en el tema. Los atributos no clave deben depender de (determinados por) la clave, toda la clave y nada más que la clave.

Esta es una vista simplificada de lo que se llama "normalización de datos". La normalización de datos ayuda a evitar la necesidad de almacenar el mismo hecho en varios lugares de la base de datos. Esta redundancia dañina no solo es un desperdicio, sino que también puede conducir a una base de datos que se contradice a sí misma. Esto es un dolor verdadero.

Convertir un diseño no normalizado en un diseño normalizado a menudo implica dividir tablas. Pero no se limite a dividir mesas al azar. Aprenda las reglas de normalización. Síguelos hasta que seas lo suficientemente experto como para saber cuándo ignorarlos.

Respondido 24 ago 12, 11:08

'Unir atributos incorrectos en una tabla' definitivamente no es bueno. Por lo general, los detecto a partir de muchos valores nulos en las filas. Pero, ¿qué pasa si los atributos realmente dependen de la clave de la tabla, pero también se pueden dividir e incluir en otra tabla usando una clave externa? ¿Dónde trazas la línea en estos casos? Comparta cualquier fuente que pueda explicar más las reglas de normalización, si las tiene. Gracias ! - Emil

WRT nulos y normalización, busque la sexta forma normal. Normalmente no me preocupo por la sexta forma normal. Cualquier tabla con varias filas se puede dividir en dos tablas relacionadas. No se preocupe por los espacios nulos y desperdiciados. Preocúpese por los nulos y la lógica de 3 valores. - Walter Mitty

Si desea fuentes que expliquen la normalización, puede buscar en la etiqueta "[normalización]" aquí en SO, o puede ir al artículo de wikipedia en.wikipedia.org/wiki/Data_normalization y siga los enlaces externos o las secciones de lecturas adicionales. Para un tratamiento en profundidad, es difícil superar a CJ Date. Probablemente puedas salirte con la tuya con un tratamiento mucho más ligero. - Walter Mitty

Usando tu address escenario específico, lo encontrará muy beneficioso si se supone que su diseño debe atender múltiples direcciones por usuario o rastrear/atrapar múltiples registros usando la misma dirección.

Alternativamente, podría considerar una implementación de tabla de direcciones más genérica en la que tenga un description campo y una type columna que etiqueta la fila como un tipo específico de dirección (p. ej. email, house, office, spouse, Etc).

La moraleja de la historia es la moraleja de esta historia, es decir, si pudiera haber más de una, tenga una mesa separada. La sobrenormalización solo se establece cuando no hay ningún beneficio en saltar la tabla adicional o dos para obtener información que:

  1. no cambia mucho,
  2. No ocurre más de una vez o
  3. Cada entidad de clave primaria debe tenerlo.

Respondido 28 ago 12, 09:08

Esta es una pregunta bastante académica. Al diseñar un modelo de base de datos, a menudo solo tiene una cosa en mente: actuación. No dividirás una mesa solo porque se ve mejor. Lo harás por ejemplo

  • cuando se puede reducir la redundancia
  • o mejorar la concurrencia.

También hay un límite de cuán grande puede ser un registro en la mayoría, cuando no en todas las bases de datos. Por lo tanto, puede dividir una tabla para que la base de datos pueda almacenarla de manera eficiente.

Es completamente diferente cuando se diseñan clases. La división de clases no tiene un gran impacto en el rendimiento, pero sí un gran impacto en el mantenimiento. La mantenibilidad debe ser la principal preocupación.

Respondido el 03 de Septiembre de 12 a las 10:09

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.