Rails ActiveRecord y DB normalización

¿Cuáles son los pros y los contras de desglosar los attributes opcionales 1: 1 en su propio model separado?

Por ejemplo, acabo de encontrar el código de Rails así:

class Dogs << ActiveRecord::Base # :id (pk), :breed, :weight, :height, :tail_length end class DogSpotsInfo << ActiveRecord::Base # :dog_id (pk), :spot_color, :avg_spot_size, :num_spots end 

Pero así es como lo habría hecho (dejando los campos de campo nulos según sea necesario):

 class Dogs << ActiveRecord::Base # :id, :breed, :weight, :height, :tail_length, :spot_color, :avg_spot_size, :num_spots end 

En el nivel DB, creo que la única diferencia es que las consultas que involucran los attributes opcionales requerirán otra unión.

¿Hay algún otro inconveniente para el primer enfoque? ¿Hay algún profesional?

EDITAR:

Supongo que en una table de perros masiva donde dicen que el 20% de los perros tienen manchas, tal vez un profesional, el enfoque anterior es un escaneo secuencial más rápido, pero no estoy 100% seguro de eso, y si ese es el único profesional parece una optimization prematura.

Otro profesional en el que puedo pensar es que mantiene los models más pequeños y orderados. Pero si ese es el objective, quizás podrías hacerlo sin afectar la estructura de la BD, al tener algo como has_spots :spot ? ¿Cuál es la mejor práctica aquí?

Incluir todos los loggings en una tabla es probablemente el path preferencel a seguir. Le da un mejor performance a costa del tamaño.

El performance es discutible dependiendo de cómo se usan realmente las tablas. Si las consultas costosas del sistema no requieren puntos de datos (como una list masiva), podría ser más rápido no tenerlos sobre la table, pero si mantuviera los datos en la tabla adaptando su consulta para get solo los datos necesarios eliminaría el costo de la consulta casi por completo.

He visto implementada la relación 1: 1 porque tiene más sentido para un desarrollador que cualquier diferencia lógica en el código. Las uniones exteriores izquierdas son más caras que las uniones interiores y las uniones son más caras que ninguna unión.

Es posible que disminuya el tamaño total de la database al no mantener esta información en la tabla, pero para la mayoría de las aplicaciones pequeñas (less de 1 TB) debería optimizar el performance.

La única situación real que creo que esta configuration sería ideal es si se quiere restringir el tipo de puntos que un usuario puede elegir o si se hizo un gran procesamiento en estos elementos de un perro por separado.

Puede get la misma sensación restrictiva al utilizar una tabla de búsqueda de todos los valores posibles y solo le permite al usuario seleccionar valores en la tabla de búsqueda. Luego retroceda e inserte valores en bruto en la tabla de perros. Esto tiene el efecto secundario de potencialmente contaminar la table de perro con datos que la aplicación web no limpió adecuadamente, pero sería un esfuerzo rápido aislar qué datos no están dentro de las restricciones al comparar con una tabla de búsqueda de puntos y corregirlos. el problema en la aplicación web.

Las relaciones 1: 1 se descomponen con frecuencia cuando la relación es del tipo "Is-A" en lugar del tipo "Has-A". En el model ER extendido esto se llama "especialización". En el mundo de las tablas de SQL, esto a veces se conoce con el nombre de "inheritance de tabla de class". Puede ver cualquiera de estos términos para get un tratamiento bastante bueno del tema correspondiente.

La inheritance de la tabla de class contrasta con la "inheritance de tabla única" que da como resultado una tabla única con NULLS en lugares donde un valor sería irrelevante. Esta parece ser tu elección para perros y manchas.

En el mundo de "Cars", una especialización podría ser una tabla para "Vehículos", una para "Autos" y otra para "Camiones". (Los "Camiones" se llaman "Camiones" en mi lado del estanque). Los automobilees y camiones son types de vehículos especializados. Los attributes que se almacenan en camiones y no en vehículos son attributes que son irrelevantes para los vehículos que no son camiones.

El propósito generalmente no es mejorar el performance, sino mejorar la forma de las consultas. Las consultas sobre datos de camiones solo pueden consultar la tabla de camiones. Las consultas sobre datos de vehículos solo pueden consultar la tabla de vehículos. Y las consultas que involucran datos sobre vehículos y camiones pueden consultar una vista que une vehículos y camiones en una columna común.

Al contrario de lo que otros han opinado, las tablas estrechas superan a las tablas anchas, aunque el efecto es menor en comparación con la indexing y las uniones.

Puede combinar la inheritance de tabla de class con una técnica llamada "key primaria compartida", que puede search. Se obtiene uniones muy rápidas y muy fáciles en comparación con otras forms de relacionar las tablas entre sí. Las keys primarias compartidas implican más trabajo en el momento de insert, porque debe propagar el valor común de la tabla generalizada a la tabla especializada apropiada bajo control de progtwig.

Si estuviera haciendo su caso, searchía maneras de explotar la especialización en torno a los diversos types de combustible que mencionó. Algunas de sus consultas pueden terminar escaneando solo una de las cinco tablas especializadas (también conocidas como "tablas de subclass") y ejecutan cinco veces más rápido.

El primer enfoque es mejor cualquier día que el segundo si tiene una gran cantidad de bases de datos.

Siempre es un punto positivo separar las cosas en una tabla separada en la que no estamos seguros de si el valor llegará o no. como en su caso perro y perro si solo 20% de los perros tienen manchas, entonces no es necesario mantenerlo en la misma tabla de database ya que el 80% de las columnas serán nulas y al recuperar datos de la tabla principal una gran cantidad de datos se elegirá lo que seguramente obstaculizará el performance del server. Si la database es pequeña, entonces quizás uno no necesariamente haga una segunda tabla

Si nos preocupa la complejidad del time de las uniones y todo lo demás, podemos aplicar la indexing, lo que networkingucirá aún más nuestro costo.

así que el punto principal

1) si la database contiene muchos loggings, aplique la técnica anterior más haga una indexing para ahorrar el costo del server

2) Si la database es pequeña, puede optar por la última

Ventajas de la des-normalización:

  • Cada tabla ocupa memory, less tablas significan less sobrecarga (una vez que lidiaba con una database con tablas de 30K con un total de 100 megas de datos, y el uso de la memory de la database era enorme)

  • El análisis manual se puede realizar fácilmente, es decir, exportar 1 tabla a Excel, Google Spreadsheets o lo que sea y usar filters

Contras

  • Muchas columnas con valores nulos.

Otro enfoque para equilibrar muchas columnas frente a tablas de attributes adicionales es usar matrices serializadas para elementos que son less comunes, como la interacción del iPod, y luego usar un server de búsqueda (elasticsearch, websolr, etc.), que puede manejar las consultas con text completo … Esto le permitiría agregar nuevos elementos a la tabla Cars sin nuevas columnas. Como auto conducción auto, auto estacionamiento auto.