2011-04-09 27 views
6

Digamos que tengo una entidad que tendrá muchos atributos, algunos que conozco ahora y otros serán definidos por el usuario. ¿Cuál es la mejor manera de modelar esto?Diseño de la base de datos: ¿EAV o no a EAV?

1) ¿Tengo una tabla principal y se refieren a una tabla de pares de nombre y valor secundario? Todos los atributos van en la tabla secundaria de EAV.

  • O -

2) ¿Pongo los atributos más comunes (no todos los usuarios se les necesita, así que esperar un montón de entradas NULL) en la tabla principal y tener la mesa EAV secundaria para los atributos definidos por el usuario?

  • O -

3) Algún otro enfoque que no he pensado?

Respuesta

0

Normalmente, muchas celdas vacías son baratas y no vale la pena normalizarlas. El único inconveniente de volver al n. ° 2 es si tiene una gran cantidad de filas (millones, donde podrían surgir problemas de rendimiento), una gran cantidad de columnas (más de 20, donde es molesto mirar los datos), o hay una serie de limitaciones únicas en la tabla EAV.

Dicho esto, ahora es 2011 y que tiene sentido utilizar un marco de programación con una capa de abstracción de base de datos en estos días para que no se está diseñando directamente las relaciones de bases de datos. Algo como el Object Relational Mapper de Django le permite enfocarse en los modelos y dejar que las mejores prácticas se cuiden (el 95% de las veces). Este tutorial lo ayudará a comenzar. Django solo se aplica al modelado de bases de datos de desarrollo web. Para entornos que no sean web, otros marcos serán mejores.

+1

Estoy usando Doctrine, aunque admito que todavía no entiendo completamente el concepto de ORM. No entiendo cómo lo hace ORM, por lo que no estoy "diseñando relaciones de bases de datos directamente". Actualmente estoy trabajando en este modelo en MySQL Workbench y estoy realizando un montón de análisis de datos solo para comprender las relaciones de mis datos. ¿Cómo me libera ORM de esto? – StackOverflowNewbie

2

Es posible utilizar la solución de dos por razones de eficiencia, en particular, si es necesario seleccionar a menudo en estas cantidades. Estos valores pueden ser "caché" de la tabla EAV, si lo desea. Presenta la duplicación pero acelera la búsqueda.

EAV es una buena solución para este problema a menos que usted tiene que realizar une a nivel db. Una alternativa es alejarse del modelo relacional y pasar a un modelo basado en RDF.

0

he hecho un montón de trabajo con el patrón de EAV, y se ha cumplido el objetivo lo suficientemente bien. Encuentro que las columnas vacías o las columnas dinámicas (como col1, col2, etc.) son mucho más difíciles de manejar después del hecho, pero puede ser más fácil consultarlas, ya que no necesita tantas uniones.

Una cosa que recomiendo encarecidamente es echar un vistazo a opciones como Mongo DB. Maneja automáticamente estructuras de datos dinámicas complejas.

Cuestiones relacionadas