Debo reconocer que soy bastante crítico al momento de modelar datos, ya que me gusta que todo quede lo mejor optimizado posible. En estos días he estado trabajando junto a mi equipo, en un proyecto el cual tienen como base tecnológica:
PostgreSQL,
Symfony y
Doctrine; todo iba viento en popa hasta que llego el momento de intervenir el mantenedor de una entidad cuya
clave primaria era compuesta y además los campos eran foráneos, lo cual gatilló en los siguientes problemas:
- Hubo que crear a mano los elementos del formulario correspondientes a los campos foraneos correspondientes a la clave primaria.
- Una vez creados, se logra ingresar un dato... hasta aquí todo parecía ir bien, sin embargo, la sorpresa apareció al momento de intentar desplegar la grilla, en la cual aparecío un flamante error en el routing (routing.yml) del backend, especificamente en la opción column que tenía como valor Array. Se intento solucionar de variadas formas propuestas como pseudo-soluciones en algunos sitios web, para nuestro infortúnio sin conseguir el exito esperado.
- Cuando casi perdiamos la esperanza y ya estabamos casi dispuestos a darle toda la responsabilidad a la capa del modelo de Symfony, nos iluminamos, pensamos y compartiendo experiencias de amigos externos (Gracias Jorge por tu infiníto tiempo libre para los amigos), en que quizás si creabamos un índice compuesto y que además sea único, con eso en teoría podíamos garantizar que no hubiesen registros duplicados (que era lo importante), y dejar como clave primaria un simple id autoincremental, y gotcha! funcionó perfecto.
A continuación dejaré una entidad de ejemplo para
config/doctrine/schema.yml y
backend/config/routing.yml.
schema.yml
MiEntidad:
columns:
id_mi_entidad:
type: integer
primary: true
notnull: true
autoincrement: true
id_foranea_uno:
type: integer
notnull: true
id_foranea_dos:
type: integer
notnull: true
relations:
ForaneaUno:
foreignAlias: MisEntidadesForaneaUno
local: id_foranea_uno
foreign: id_foranea_uno
type: one
foreignType: many
ForaneaDos:
foreignAlias: MisEntidadesForaneaDos
local: id_foranea_dos
foreign: id_foranea_dos
type: one
foreignType: many
indexes:
mi_entidad_index_unq:
fields: [id_foranea_uno, id_foranea_dos]
type: unique
routing.yml
mi_entidad:
class: sfDoctrineRouteCollection
options:
model: MiEntidad
module: mi_entidad
prefix_path: /mi_entidad
column: id_mi_entidad
with_wildcard_routes: true
Espero que este post, les sea de todo su gusto y les permita optimizar de mejor forma su tiempo que a mi :P.
Pd, Disculpen la indentación y recuerden que en
yamel la indentación es de
dos espacios y no de una
tabulación tradicional (cuatro espacios).