Debo registrar unas solicitudes, el problema radica en que las solicitudes las puede hacer una comunidad o una institución pero los campos son los mismos, tengo una tabla para comunidades y una para instituciones, que me recomiendan, creo 2 tablas, una para solicitudes por comunidades y una para solicitudes por instituciones? o creo una sola tabla con id de solicitantes y el id de comunidades y que quede en nulo 1 cuando haga un registro?
Si tanto la tabla de comunidad como la de institución tienen las mismos campos, no veo porque lo divides. Podrías
unirlo y ya identificar con otro campo el tipo, pero si ya es obligatorio como lo tienes seguiré pensando en alguna forma para desarrollarlo como tu deseas.
Es sabio siempre tener en mente las reglas de normalización de BBDD; evitan muchos problemas posteriores. Por ejemplo se me ocurre que con 2 tablas puedes tener duplicidad de las llaves foráneas de la solicitud que apuntan al solicitante; ¿a qué tabla pertenece?
Considera usar una tabla maestra que contenga un campo de tipo y todos los campos necesarios de ambos tipos de solicitantes, y cuyo modelo es una superclase. Entonces puedes utilizar el patrón de diseño Factory para instanciar modelos separados para comunidades e instituciones (subclases) donde solo acceden a sus respectivos campos además de los que tengan en común. Los que no les pertenecen son "invisibles" ni tampoco ocupan espacio en la tabla. Y las llaves foráneas de la solicitud son inequívocas pues solo apuntan a una tabla.
No voy a entrar en una explicación técnica ni complicada ya que puedes buscarlo en Google. Para los efectos de tu aplicación el modelo de la tabla maestra que contiene todos los campos para ambos solicitantes es la fábrica ("factory"). Esta es la superclase de donde se derivan ("fabrican") dos subclases: un modelo para las instituciones y otro modelo para las comunidades. Además de definir sus propios atributos, ambos modelos pueden tener en común cero o más propiedades/atributos/campos de la tabla maestra.
modelo Solicitante.php:
class Solicitante extends CActiverecord
{
public function tableName()
{
return 'Solicitante';
}
// definición de los atributos en común
...
}
modelo Institucion.php
class Institucion extends Solicitante
{
// definición de los atributos específicos de la institucion - los comunes ya están disponibles
}
...
modelo Comunidad.php
class Comunidad extends Solicitante
{
// definición de los atributos específicos de la comunidad - los comunes ya están disponibles
...
}
En la solicitud y dependiendo del tipo de solicitante escoges el modelo y defines los campos específicos a poblar. En ambos casos trabajas con una sola tabla así que evitas los problemas antes mencionados.
Espero haber explicado satisfactoriamente; de lo contrario me avisas.