2012-04-08 18 views
10

Así que todos sabemos que STI de rails (herencia de tabla única) es repulsivo porque conduce a un modelo de datos desordenado y una base de datos subóptima.Herencia de PostgreSQL en ActiveRecord?

Sin embargo, PostgreSQL parece manejar la herencia bastante bien.

¿Hay alguna forma de obtener la buena API de STI limpia de los rieles mientras se utiliza la herencia de Postgres en lugar de las tablas demasiado anchas y las columnas de "tipo"?

+1

"Así que todos sabemos que STI de los rieles (herencia de tabla única) es asqueroso porque conduce a un modelo de datos desordenado y una base de datos subóptima". --- No acepto esta premisa. –

+0

Está bien, quizás sea una generalización ... Pero tiende a ser una buena idea cuando tus modelos infantiles no tienen muchas propiedades que no se aplican a los otros niños. De lo contrario, terminas con mesas enormes llenas de columnas anulables. Puede estar bien desde la perspectiva de los rieles, pero puede ponerse un poco feo cuando se ejecuta SQL sin formato en la base de datos, tal vez la herencia de PostgreSQL no sea más rápida, ¡pero al menos me oculta todo eso! : P –

+0

Debido a que la herencia de Postgres encaja perfectamente, no creo que basta con tener una columna de 'tipo'. Por lo que he visto con herencia, 'SELECT *' devolvería todas las columnas asociadas (y creo que todas las columnas no asociadas también:/... Pero su estructura de base de datos estaría más limpia. – stuartc

Respuesta

3

En resumen, no hay una buena API de STI limpia para lo que está tratando de lograr a partir de ahora.

De hecho, me miró a los que hace aproximadamente un año y llegaron a la conclusión de que no es una buena idea por varias razones:

  1. Si desea utilizar las características específicas de PostgreSQL - que son básicamente casar con usted mismo a esa DB. No me malinterpretes PostgreSQL es una gran base de datos y la he usado en varias ocasiones, pero vas a quedarte atrapado con ese diseño de base de datos y de aplicaciones.
  2. Es muy probable que si comienzas a utilizar funciones específicas de DB, termines implementándolas manualmente (ejecutando algún tipo de comandos en la base de datos o usando la GUI) o escribiendo algún tipo de script que tendrás que invocar cuando estés ejecutando db: migrate (tendrá que hacerlo si quiere hacer las pruebas adecuadas). Después de un tiempo se vuelve engorroso y molesto.
  3. Si encuentra que son cada vez más molesto con, al citar que "tablas dolorosamente de ancho y '' columnas" de tipo entonces:
    • Su diseño de la mesa tendrá que ser reconsiderada y se puede rehacer
    • Sus modelos pueden no ser buenos candidatos para STI
    • Solo tienes que vivir con eso.

mayoría de los problemas que realmente se reducen a esto: Esfuerzo vs Beneficio.

En su caso, debe hacerse esta pregunta:

  • ¿Cuánto tiempo desea pasar en la implementación de una mejor ITS estructura si sólo acelerará su consulta SQL prima por unos segundos ? ¿Tal vez es mejor escribir una consulta SQL más explicativa? La mayoría de las aplicaciones no crecen hasta el tamaño en que realmente se convierte en un problema. Pero tal vez sea diferente en tu caso.

PS:

También un consejo rápido en la estructuración de las ITS en su aplicación: Si usted encuentra que usted tiene una gran cantidad de modelos que utilizan las ITS como un ProductCategory, CommentCategory, PhoneCategory, ClientCategory que todos heredan de Cateogory: tiendo a organizarlos en carpetas dentro del directorio de modelos. Luego, en application.rb sólo tiene que añadir una línea: config.autoload_paths += Dir[Rails.root.join('app', 'models', '{**/**}')]

+1

¿Cuándo alguna vez en el curso? de sus motores de base de datos de producción de cambio de carrera?: P Estoy hablando de compañías de muchachos, no de su "start up" que comenzó con sus amigos de HS y usted es el CEO y ella es la CTO. – Volte

+0

Tipo de verdad, y En general, no cambia mucho la implementación de la producción, a menos que sea necesario. Twitter y Facbook son los principales ejemplos que le vienen a la mente. Usted migró a una nueva configuración en el transcurso de un tiempo. Desde una experiencia personal, - Me pasó varias veces. Tuve que migrar aplicaciones internas de viejas configuraciones obsoletas. – konung

+0

@bwicklund - bueno, la pregunta era sobre PostgreSQL y STI en ActiveRecord (Rails) y si había una NICE CLEAN Manera de manejarlo, y la respuesta fue que NO había una manera agradable y limpia de manejar las ITS excepto en casos simples, y les expliqué por qué. Solo porque no te gusta la respuesta no significa que esté mal. Si tiene una mejor explicación, no dude en dar su propia respuesta. – konung

6

Sin embargo PostgreSQL parece manejar la herencia bastante bien!

¿Realmente?¿Has mirado de cerca el small print in the manual? Por ejemplo:

  • limitaciones únicos (y por tanto también las claves primarias) son no sea posible sobre los niveles de herencia.
  • Las referencias a las tablas heredadas y la tabla base no se mezclan. Es decir. (tomado aproximadamente del manual): capitals extiende cities. Su tabla address quiere hacer referencia al cities. Puede. Pero no se puede usar la dirección con capital.

Estas dos cosas son muy importante en algo más allá de un pequeño proyecto "Hello World". Así que no puedo imaginar que cualquier cosa productiva se pueda implementar usando la herencia de PostgreSQL.

+1

En realidad, según tengo entendido, es bastante útil para la división de tablas. Pero es cierto que no es adecuado para la herencia del espacio modelo como es ahora. – Divide

+0

Incluso la fusión de tablas no es posible con esto en la mayoría de los casos: si tiene más de una restricción única, está atornillado. Y dado que la mayoría de los marcos utilizan una clave sustituta, esto significa que ni siquiera puede tener una restricción única para los datos de la aplicación. –

+0

Por supuesto, si está utilizando claves sustitutivas, a menudo la fragmentación se vuelve más difícil. Los documentos de Psql tienen un buen ejemplo de sharding: http://www.postgresql.org/docs/9.1/static/ddl-partitioning.html – Divide

Cuestiones relacionadas