Me interesa cuál es la mejor práctica para un modelo que tiene muchos datos adjuntos. La mayor parte de mi aplicación gira en torno a un modelo (SKU), y parece tener cada vez más cosas asociadas.

Por ejemplo, mi modelo de SKU tiene varios precios, dimensiones, peso, precios recomendados para varios niveles de precios, título, descripción, vida útil, etc. ¿Tendría sentido dividir toda la información de precios en otra tabla? ¿O dividir el SKU en diferentes usos del SKU y asociarlos? Por ejemplo, WebSKU, StockSKU, etc.

3
Aaron Campbell 27 ene. 2016 a las 20:35

4 respuestas

La mejor respuesta

Como dijeron todos los demás, el diseño de una base de datos debería responder a la lógica que hay detrás. ¿Por qué? Principalmente, porque será más fácil de mantener y comprender.

También iba a llamar la atención sobre las reglas de normalización, como hizo @sawa.

Generalmente, es un buen enfoque para normalizar su base de datos, ya que ofrece varias ventajas. Debería leer este enlace de wikipedia (al menos como punto de partida).

Seguir las reglas normales le ayudará a diseñar su base de datos teniendo en cuenta la lógica detrás de sus datos.

Pero la desnormalización también tiene sus ventajas. El primero (siempre considerado) es optimizar el rendimiento de lectura. Básicamente, esto significa tener datos en una tabla que habría tenido en diferentes tablas al seguir las reglas normales, y generalmente tiene sentido cuando esos datos tienen alguna relación lógica.

Tienes que apuntar a lograr un equilibrio en función del problema al que te enfrentes.

Por otro lado, para las etiquetas en su publicación, puedo ver que está usando ruby on rails, que usa el patrón de registro activo. Una consecuencia del modelo de base de datos que está presentando es que probablemente tendrá un modelo de dominio igual de complejo. Quiero decir, muy grande. No conozco todos los detalles de tu proyecto, pero supongo que se convertirá rápidamente en un objeto de dios, lo que hace que su código sea difícil de mantener, ampliar y comprender.

2
Aldana 27 ene. 2016 a las 20:12

Creo que es bueno diseñar un modelo de datos, teniendo en cuenta cómo funciona el motor DB con los archivos y la memoria. El primer cuello de botella de PostgreSQL es el archivo IO. El consumo de memoria también es una parte importante. Cuando PostgreSQL lee algunos datos de la tabla (para su información: los datos de la tabla no se leen en los escaneos de solo índice), lee páginas de 8 KB (parámetro de tiempo de compilación). Más tuplas en una página de este tipo, menos E / S de archivos, menos consumo de memoria, mejor uso de caché (más visitas, precalentamiento rápido, etc.), mejor rendimiento.

Por lo tanto, si uno tiene un proyecto muy cargado, puede ser útil pensar en la separación de los datos de uso frecuente en tablas aisladas (como siguiente paso: coloque estas tablas en un espacio de tabla separado en SDD o RAID potente).

Es decir. Debería haber cierto equilibrio entre la simplicidad lógica y los ajustes de rendimiento.

1
Dzenly 27 ene. 2016 a las 21:03

La base de datos debe diseñarse no de acuerdo con la cantidad de columnas que tiene, sino de acuerdo con la lógica, particularmente siguiendo formas normales de Codd. Si hay una redundancia sistemática en su base de datos, entonces eso es una señal para dividirla en varias tablas. Si no es así, déjelo como está.

2
sawa 27 ene. 2016 a las 18:10

Como se menciona en la respuesta vinculada por Tom, si todos sus atributos realmente pertenecen a ese modelo, no hay razón para dividirlo. Sin embargo, si tiene columnas como price1, price2, price3 o dimension_x_1, dimension_y_1, dimension_x_2, dimension_y_2, etc. , entonces generalmente significa que debería crear otra tabla para contenerlos.

Por ejemplo, puede configurarlo para que tenga los siguientes modelos

Sku
has_many :prices
has_many :dimensions

Price
belongs_to :sku

Dimension
belongs_to :sku
3
T J 27 ene. 2016 a las 17:55