2010-11-03 8 views
33

Tengo una base de datos que almacenará perfiles de personas. Estas personas tienen alrededor de 50 campos posibles.¿Qué hay mejor, muchas mesas pequeñas o una mesa grande?

Algunas son cosas comunes como, nombre, apellido, correo electrónico, número de teléfono.

Otros son cosas como aficiones, habilidades, intereses

Algunos son altura, peso, color de la piel.

Cada uno de estos grupos es utilizado por el sistema en diferentes momentos. En términos de poder negociar a través de la base de datos, preferiría tener 7 tablas cada una de aproximadamente 8 campos. ¿Cuál es la mejor práctica para hacer?

EDIT: Los datos se va a utilizar en un motor de búsqueda, para encontrar coincidencias perfil. ¿Esto afecta lo que estoy haciendo?

Respuesta

30

Es difícil de decir y se basa en lo que requiere la aplicación. Yo diría que mire en Database Normalization, ya que le mostrará cómo normalizar la base de datos y en que debería arrojar luz sobre lo que le gustaría separar en sus propias tablas, etc.

+6

+1 para la normalización –

+0

Los datos se usarán en un motor de búsqueda para encontrar coincidencias de perfiles. ¿Esto afecta lo que estoy haciendo? – Ash

+0

si va a recuperar de un RDBMS, entonces normalice.Afectará lo que está haciendo de manera positiva – Randy

3

No hay una respuesta correcta a esta pregunta porque depende en gran medida de cuándo y cómo va a utilizar sus datos, con qué frecuencia cambiará y cuál será el volumen de uso en la base de datos.

Lo que personalmente haría sería organizar sus datos en entidades lógicas y crear tablas basadas en esas entidades. Esto es al menos donde comenzaría.

+0

No me preocuparía tanto el volumen de uso como la calidad de los datos. –

2

muchas tablas pequeñas, es decir, la normalización es la mejor aquí. proporciona flexibilidad, reduce la redundancia y una mejor organización de la base de datos.

6

Según lo que ha descrito, ciertamente dividiría eso en varias tablas. Sin embargo, no me dividiría en un número arbitrario de columnas; en su lugar, trataré de pensar en colecciones lógicas de columnas que conforman una entidad o coinciden con los patrones de acceso que utilizará para ingresar los datos

+0

sí, esa figura es solo un ejemplo, los datos se agruparán semánticamente. – Ash

2

. no es una organización de bases de datos 100% correcta, solo hay una que sea lo suficientemente buena para sus propósitos. Si no prevé sobrepasar las capacidades de un solo buen servidor de base de datos en el futuro, entonces normalice los datos y utilice muchas restricciones como claves externas, eliminaciones en cascada y eso hará que su base de datos sea un placer trabajar con ella. Por otro lado, si observa las bases de datos de muchas aplicaciones que tienen miles de millones de solicitudes, encontrará que renuncian a muchas de estas sutilezas en nombre del rendimiento y la escalabilidad.

+4

Eres la primera persona que escucho que dice "Las deleciones en cascada son un placer trabajar con ellas" –

4

IMO, es más importante preocuparse por la calidad de los datos almacenados que la cantidad de tablas que necesita.

Por ejemplo, ¿necesita realizar un seguimiento de los cambios? Si John tenía 5'2 "en enero de 2007 y 5'11" en octubre de 2010, ¿quieres saber? Si es así, deberá separar a la persona de la altura en dos tablas.

¿Qué pasa con los pasatiempos? ¿Se les permite tener solo 3 pasatiempos? ¿Pueden tener más/menos? ¿Es esto algo que le gustaría consultar en el futuro? Si es así, necesitas una tabla separada.

Debe leer sobre el diseño y la normalización de la base de datos (hay varios hilos excelentes en este sitio).

https://stackoverflow.com/questions/tagged/normalization

5

A menos que todas las personas tienen el mismo número de aficiones (IE cada uno tiene 2 aficiones en la lista), debe normalizarse.

Los campos que siempre son de 1 a 1 con la persona deben estar en la misma tabla. Edad por ejemplo. Ninguna persona tendrá dos edades diferentes.

4

Recomendaría algunas tablas. Sobre la normalización es difícil de administrar y terminaría escribiendo consultas complejas que terminan con un rendimiento lento.

Normalice solo cuando sea absolutamente necesario y piense en términos lógicos. Con la escasa información que ya ha proporcionado anteriormente, me gustaría ir por tres tablas:

Tabla 1: PersonalDetails Tabla 2: Actividades Tabla 3: Varios

Existen otras técnicas para acelerar el rendimiento, como la agrupación, etc., que puede usar según su necesidad.

22

Estoy con el campamento Normalize.

Éstos son algunos consejos para ayudarle a empezar:

de inicio con un proceso para asignar algún identificador único arbitraria a cada "persona" . Llame a esto PersonId o algo así. Este identificador se llama una clave sustituta. El único propósito de una clave sustituta es garantiza una relación de 1 a 1 entre él y una persona real en el mundo real. Use la clave sustituta cuando asocie el valor de algún otro atributo a una "persona" en su base de datos.

A medida que desarrolla el diseño de su base de datos, puede encontrar las claves sustitutivas necesarias (o al menos útiles) para algunos otros atributos también.

Mire cada atributo que desea administrar. Haga la siguiente pregunta: ¿Alguna persona tiene solo un valor para este atributo?

Por ejemplo, cada persona tiene exactamente una "Fecha de nacimiento". Pero, ¿cómo pueden tener "pasatiempos"? Probablemente de cero a muchos. Los atributos de un solo valor (por ejemplo, fecha de nacimiento, altura, peso, etc.) son candidatos para ir a una tabla común con PersonId como la clave. El número de atributos en cada tabla no debería ser en este punto.

Atributos de múltiples valores como Hobby necesitan un tratamiento ligeramente diferente . Es posible que desee crear tablas separadas para cada atributo multivalor. Utilizando Hobbies como un ejemplo , puede crear la siguiente tabla PersonHobby(PersonId, Hobby). Una fila en esta tabla puede parecer algo así como: (123, "Stamp Collecting"). De esta forma, puede registrar tantas pasatiempos como sea necesario para cada persona, uno por fila. Haga lo mismo con "Interés", "Habilidad", etc.

Si hay un buen número de atributos de varios valores donde la combinación de PersonId + Hobby determinan nada más (es decir. Que no tienen nada interesante para registrar información sobre esta persona que realiza este "hobby" o "interés" o "Habilidad") puede agruparlos en una tabla de valor-atributo que tiene una estructura algo así como PersonAV(PersonId, AttributeName, Value). Aquí una fila podría ser parecida a: (123, "Hobby", "Stamp Collecting").

Si usted va esta ruta, también es una buena idea para sustituir la AttributeName en la tabla PersonAV de una clave sustituta y crear otra tabla para relacionar esta clave a su descripción. Algo como: Attribute(AttributeId, AttributeName). Una fila en esta tabla se parecería a (1, "Hobby") y una fila correspondiente PersonAV podría ser (123, 1, "Stamp Collecting"). Esto es comúnmente hecho para que si alguna vez necesita saber qué AttributeNames son válidos en su base de datos/aplicación tiene un lugar para buscarlos. Piense en cómo puede validar si el "Interés" es un valor válido para AttributeName o no; si no ha registrado a alguna persona que tenga ese AttributeName, entonces no hay registro de ese en su base de datos. ¿Cómo puede saber si debería existir o no? ¡Búscalo en la tabla Attribute!

Algunos atributos pueden tener relaciones múltiples y eso también influirá en cómo se normalizan las tablas. No lo hice vea cualquiera de estas dependencias en su ejemplo, así que considere lo siguiente: Supongamos que tenemos un almacén lleno de piezas, el PartId determina que es WeightClass, StockCount y ShipCost. Esto sugiere una tabla algo así como: Part(PartId, WeightClass, StockCount, ShipCost). Sin embargo, si existe una relación entre atributos no clave, entonces se deben tener en cuenta. Por ejemplo, suponga que WeightClass directamente determina ShipCost. Esto implica que WeightClass solo es suficiente para determinar ShipCost y ShipCost se debe tener en cuenta fuera de la tabla Part.

La normalización es un arte bastante sutil. Debe identificar las dependencias funcionales que existen entre todos los atributos en su modelo de datos para hacerlo correctamente. Solo crear las dependencias funcionales requiere un poco de reflexión y consideración, pero es fundamental para lograr el diseño adecuado de la base de datos.

Lo invito a tomarse el tiempo para normalizar el estudio un poco más antes de construir su base de datos. Pasar unos días aquí será más que rentable. Intente hacer algunas búsquedas de Google/Wikipedia para "Dependencia funcional", "Normalización" y "Diseño de la base de datos". Lea, estudie, aprenda y luego compárelo bien.

Las sugerencias que he hecho con respecto a la normalización del diseño de su base de datos son solo un indicio de la dirección que podría necesitar tomar. Sin tener una buena comprensión de todos los datos que está tratando de administrar en su aplicación, cualquier consejo dado aquí debe tomarse con un "grano de sal".

Cuestiones relacionadas