2008-10-22 7 views
1

J'ai besoin de créer la fonctionnalité pour permettre à mes utilisateurs enregistrés de s'associer à d'autres usages et de créer une famille. Mes tables de base de données ressemblent à ceci:Quelle est la meilleure façon de créer une relation tableA HABTM tableA pour une application CakePHP?

db.persons - (Bob, Jane, Timmy, etc.)

  • id
  • Nom
  • email

db .persons_persons

  • id
  • person__id_parent
  • person_id_child
  • relationtype_id

db.relationtypes - (conjoint, enfant, neveu, etc.)

  • id
  • Nom

Avec cette structure, je devrais pouvoir spécifier que Bob est un conjoint de Jane dans la table persons_persons. Le record db.persons_persons ressemblerait à quelque chose comme (psuedo):

ID | person_parent | person_child | relationtype 
1 | Bob   | Jane   | Spouse 
2 | Bob   | Timmy  | Child 

Je sais que cela pourrait causer une certaine fragmentation des données depuis si Bob et Jane sont mariés, alors un enfant d'un devrait être associé à l'autre . Cependant, ce n'est pas ma question. Ma question est de savoir si cette configuration de base de données est «la plus correcte» pour une utilisation dans une application cakePHP.

Répondre

2

Tout d'abord, CakePHP automatigally une table infléchissent people dans un contrôleur people et un modèle person, de sorte que vous n'avez pas besoin de l'appeler persons. Ensuite, j'appellerais la table de recherche relationships plutôt que persons_persons.

Je dirais que les champs dans vos relations tableau person_id, relation_id et relation_type_id, puis ajoutez un trait de soulignement dans votre nom de la table relationtypes il devient relation_types.

Je pense que c'est plus sémantique. Vous pouvez toujours utiliser une association hasAndBelongsToMany et utiliser les associations automagiques "with" proposées par CakePHP (1.2 uniquement) pour accéder aux données supplémentaires dans la table HABTM pour le type de relation.

Cependant, je serais tenté d'utiliser:

  • Person hasMany Relation
  • Relation belongsTo Person, Relation, RelationType

Dans votre application, est une relation de personnes sous-entendus par quelqu'un la relation d'autre à eux? C'est à dire. Si vous trouvez Person.id = 1, vous pourriez obtenir toutes leurs relations, par ex. Person.id 2, 3 et 4. Mais si vous trouvez Person.id 2, vous n'obtiendrez pas automatiquement Person.id = 1, à moins qu'il n'y ait un autre enregistrement dans la table des relations qui représente cette relation.

Pour ce faire, vous pouvez configurer un autre assocation:

  • Person hasMany Relation1 avec foreignKey person_id
  • Person hasMany Relation2 avec foreignKey relation_id
  • Relation belongsTo Person, Relation, RelationType

Notez que vous pouvez également réaliser cette double relation avec HABTM.

+0

C'est exactement le genre de conseil que je cherchais. Très clair, perspicace et bénéfique. Merci beaucoup. –