2009-10-19 2 views
0

Je travaille donc sur un CMS qui permettra aux utilisateurs de "traverser" les tables de la base de données. J'ai quelques difficultés à le mettre en œuvre, et je me demande si quelqu'un a des suggestions.MySQL dot-traversal ... possible?

Table: house 
name (varchar), town (relationship, using the rel table) 

Table: town 
name(varchar), state (relationship, using the rel table) 

Table: state 
name(varchar) 

Table: rel 
id1, id2, rel_type 

L'exemple suivant montre son utilisation prévue. Il se lit comme suit: «Trouvez 10 maisons dans l'État de l'Alaska, classées par ordre alphabétique».

<?php 
$Record = new Pod('house'); 
$Record->findRecords('name ASC', 10, "town.state.name = 'Alaska'"); 
?> 

Comme une note de côté, je peux facilement trouver des maisons dans un nom de ville, depuis MySQL prend en charge [tableau] [dot] [column_name]:

<?php 
$Record = new Pod('house'); 
$Record->findRecords('name ASC', 10, "town.name = 'Great Falls'"); 
?> 

je pouvais toujours mettre un "état" champ dans la table "maison" directement, mais les utilisateurs ont besoin de la possibilité de référencer les colonnes d'autres colonnes. Merci d'avance!

Répondre

4

Vous devez utiliser un join, par exemple:

SELECT 
    house.* 
FROM 
    house 
    JOIN town ON town.id = house.town 
    JOIN state ON state.id = town.state 
WHERE state.name = 'Alaska' 

La requête travaillerait avec 1: N relations, mais puisque vous utilisez M: N relations (mise en œuvre d'une manière bizarre), vous allez besoin de rejoindre quelques tables de plus.

Cela rend le modèle d'objet un peu plus complexe, vous devrez penser à une nouvelle API pour ce genre de requêtes. Ou utilisez (voir comment cela fonctionne) un système ORM existant.

Pour expliquer le problème 1: N vs M: N - il n'est pas très commun d'avoir des ID pointant vers d'autres tables sans contraintes de clé étrangère dans des bases de données bien conçues. La façon habituelle au modèle M: ​​N relations serait:

  • maison: id int (PK), nom varchar
  • house_town: Maison int (PK, FK références house.id), ville int (PK, FK références town.id)
  • ville: id int (PK), nom varchar

Et pour 1: N relations:

  • maison: id int (PK), nom varchar, ville int (FK se référer ences town.id)
  • ville: id int (PK), nom varchar