2009-09-24 12 views
79

Estoy configurando una tabla que puede tener más de 70 columnas. Ahora estoy pensando en dividirlo ya que algunos de los datos en las columnas no serán necesarios cada vez que se acceda a la tabla. Por otra parte, si hago esto, me queda la necesidad de usar uniones.mysql: ¿cuántas columnas son demasiadas?

¿En qué punto, si corresponde, se consideran demasiadas columnas?

+6

No tenemos que usar SELECT * todo el tiempo. Siempre tenemos la opción de seleccionar solo las columnas que necesitamos para una situación dada. – APC

+3

70 columnas ?! ¿Cuántos de esos no pueden ser nulos? –

+1

La gran pregunta es ... ¿estás normalizando tus mesas? 70 es una cantidad inusual a menos que deliberadamente se desnormalice por el rendimiento (muy pocas cosas tienen 70 atributos únicos). Si se está desnormalizando en aras del rendimiento, entonces estaría de acuerdo con ChssPly76 en que puede usar lo que sea que la base de datos le permita salirse con la suya. – Godeke

Respuesta

104

Se considera demasiados cuando está por encima del maximum limit supported by the database.

El hecho de que no necesite que cada columna sea devuelta por cada consulta es perfectamente normal; es por eso que la instrucción SELECT le permite nombrar explícitamente las columnas que necesita.

Como regla general, la estructura de su tabla debe reflejar su modelo de dominio; si realmente tiene 70 (100, qué tiene usted) atributos que pertenecen a la misma entidad, no hay razón para separarlos en varias tablas.

+4

+1 me rompió –

+2

si tiene una tabla "Persona", normalmente tiene columnas como "nombre", "sexo", "fecha de nacimiento", etc. si comienza a agregar columnas como "isSoccerPlayer" y "numberOfTeethPulled" solo porque el máximo Aún no se ha alcanzado el límite de las columnas de la base de datos, no solo está loco y está creando una base de datos incorrecta, sino que realmente está dificultando el trabajo. podrías pensar que lo estás haciendo más fácil, pero realmente no lo eres. usted está peleando cómo funcionan las bases de datos, busque la normalización –

+20

@KM - por eso dije "atributos que pertenecen a la misma entidad en el modelo de dominio". El alto número de columnas en la tabla NO lo convierte en desnormalizado; es lo que dichas columnas representan lo que importa. Además, aunque la normalización es definitivamente una buena cosa, NO es una solución para todos los problemas de la vida. Pregunta engañosa: ¿cree que el número de votos al lado de SO pregunta/respuesta se calcula como 'seleccionar recuento (*) de votos' cada vez o cree que tal vez está desnormalizado? ¿Eso hace que la base de datos SO sea mala y Jeff Atwood loco? – ChssPly76

21

La tabla se divide en varias con menos columnas, lo que también se llama Vertical Partitioning. Aquí están algunos:

  1. Si tiene tablas con muchas filas, la modificación de los índices puede tomar un tiempo muy largo, ya que MySQL necesita reconstruir todos los índices en la tabla. Tener los índices divididos en varias tablas podría hacerlo más rápido.

  2. Según las consultas y los tipos de columnas, MySQL podría escribir tablas temporales (utilizadas en consultas de selección más complejas) en el disco. Esto es malo, ya que el disco I/O puede ser un gran cuello de botella. Esto ocurre si tiene datos binarios (texto o blob) en la consulta.

  3. Wider table can lead to slower query performance.

No te prematuramente optimizar, pero en algunos casos, puede obtener mejoras de las tablas más estrechas.

+4

¿Por qué MySQL necesita reconstruir todos los índices en la tabla si solo se modifica uno? –

+0

Me preguntaba lo mismo. ¿Por qué MySQL reconstruye todos los índices en la tabla? ¿Es correcta la afirmación mencionada anteriormente? – maj

10

Es demasiado cuando viola las reglas de normalización. Es bastante difícil obtener tantas columnas si está normalizando su base de datos. Diseñe su base de datos para modelar el problema, no en torno a ninguna regla o idea artificial sobre la optimización para una plataforma de db específica.

Aplica las siguientes reglas a la tabla ancha y es probable que tengas muchas menos columnas en una sola tabla.

  1. No hay elementos repetidos o grupos de elementos
  2. sin dependencias parciales en un concatenados clave
  3. sin dependencias de atributos no clave

Aquí es un link para ayudarle a lo largo.

+14

'Es bastante difícil obtener tantas columnas si está normalizando su base de datos. No es tan difícil como parece. –

+5

Definitivamente no es tan difícil. La gente no parece entender realmente las formas normales en torno a estas partes aquí. Puedes tener 10000 columnas y TODAVÍA estar normalizado (incluso en la forma normal más alta). – Hejazzman

+1

Me resulta muy difícil de creer. Claro, hay casos extremos, pero en general parece muy difícil pensar en un objeto con 1000 atributos distintos que no puedan ser sub-agrupados. – JohnFx

Cuestiones relacionadas