Je souhaite créer une application pour plusieurs hôtels d'un même groupe, pour une meilleure organisation je souhaite créé une base de données avec une structure identique par hôtel.
Mon problème est que je veux pouvoir visualiser une information dans l'ensemble des bases de données (hôtel)

le code que j'imagine :
"
try
{
$bdd = new PDO('mysql:host=127.0.0.1:3307;;charset=utf8', 'root', 'mdp');
$bdd->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
}
catch (Exception $e)
{
die('Erreur : ' . $e->getMessage());
}
$req_recherche_nom_hotel = $bdd->prepare('SELECT nom
FROM hotel_1.client, hotel_2.client, hotel_3.client
WHERE nom = :nom ');
$req_recherche_nom_hotel->bindValue('nom', 'thomas, PDO::PARAM_STR);
$req_recherche_nom_hotel->execute();

"
Le résultat que je souhaite : Avoir tous les clients des hôtels avec le nom thomas

Encore merci d'avance.

5 réponses


popotte
Réponse acceptée

Hello :)

Alors pour la lourdeur de la BDD, tu n'a pas une collection à loop (NoSQL, mais de toutes façons le NoSQL peut loop des millions de données), tu as une base de données relationnelle (SQL) Du coup pas de soucis de lourdeur à avoir, chaque ligne est indexée par un id, ta base de données ne va pas se fatiguer à parcourir ta base, elle va pointer vers l'index qui l'interesse directement, du coup tu peux faire une table unique hotels :p

Ce qui pourrait ralentir la base de donnée, ce n'est pas sa taille mais le nombre de requetes qu'il se prends en même temps, même si tu utilise plusieurs tables, la charge se fait au niveau du serveur, pas au niveau des tables, pour régler ce problème il faut utiliser un lod balancer (un répartisseur de charge) en gros ta base de donnée sera redondée sur plusieurs serveurs dans des datacenter différents (à la base c'est pour éviter les pertes de donées, par exemple un incendie dans un datacenter comme a subit OVH, tes données sont stockées dans encore 3autres datacenters OVH du coup c'est bon) ensuite le load balancer va montorer la charge que subit tes serveurs, et il va envoyer les requêtes sur le serveur le moins chargé, bon pas trop clair ce que je dis, tiens un dessin pour voir comment ça fonctionne Le dessin :p

Pour ta base de donnée, il faudrait un format de ce genre:

hotels:
- id
- name
- autres infos...

customers:
- id
- hotel_id # clé étrangère
- name
- autres infos...

Et pouur la requete SQL:

SELECT * from customers JOIN hotels ON customers.hotel_id = hotel.id WHERE customer.name = "Thomas"

Avec cette requete tu va uniquement sortir les hotel qui sont lié avec les client qui se nomment Thomas, les autres hotels seront ignorés donc pas de charge ^^

je sens la mauvaise conception de bdd.

une table pour les hôtels
une table pour les clients avec un champs avec l'id de l'hôtel

comme cela, tu auras besoins que de faire une requête sur la table client avec une jointure pour avoir le nom de hôtel.

et au moins pour faire des mises à jour, tu n'as besoin de modifier toutes les bdd

tom256
Auteur

merci pour ta reponse.
Pour ça pas de soucis.
je vais essayer d'expliquer ma réflexion, je ne sais pas si elle est bonne ?
Mais en fait je voulais séparer les BDD pour éviter d'en avoir une trop lourde et du coup plus lent.
Car la majorité de l'utilisation va être des personnes d'un hôtel qui va se connecte directement sur leur BDD correspondant et qui n'ont pas besoin d'accéder aux données des autres hôtels.
Le multiselect était plus pour les personnes du siège pour un reporting des informations de l'ensemble des hôtels.

tom256
Auteur

Merci beaucoup à vous deux pour les informations :)

Avec plaisir ;)