par
sadeq » 09 sept. 2008, 00:19
J'ai une idée.
Tu mets une seule table pour stocker les infos des tes serveurs quelque soit leur rang dans la
hiérarchie et pour distinguer les fils des parents tu ajoute dans cette même table un champ
"id_parent" qui désigne l'id du serveur père d'un serveur fils. Les serveurs pères suprêmes n'ayant
pas de père se voit attribués la valeur NULL dans leur champ "id_parent"
En ce qui concerne le lien non hiérarchique qui peut exister entre serveurs de même rang, il faut
créer une seconde table où on peut associer les serveurs amis deux à deux sachant que pour une
liaison bidirectionnelle on aura 2 enregistrements maxi pour 2 même serveurs associés et pour les
liaisons unidirectionnelle on en aura 1 enregistrement maxi. Mais bon en s'en fou pour l'instant.
Voici donc la structure de cette solution, agrémentée par 2 requêtes qui vérifient l'objectif à savoir :
- La liste des serveurs amis ayant un rang hiérarchique équivalent (server_to_server_list)
Le liste des sous-serveurs reliés hiérarchiquement à leurs parents (child_parent_server_list)
Script SQL:
Code : Tout sélectionner
-- phpMyAdmin SQL Dump
-- version 2.11.6
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
-- Généré le : Mar 09 Septembre 2008 à 00:05
-- Version du serveur: 5.0.51
-- Version de PHP: 5.2.6
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- Base de données: `test`
--
-- --------------------------------------------------------
--
-- Structure de la table `server`
--
-- Création: Lun 08 Septembre 2008 à 23:16
--
CREATE TABLE `server` (
`id` int(10) NOT NULL auto_increment,
`number` varchar(10) NOT NULL,
`id_parent` int(11) default NULL,
PRIMARY KEY (`id`),
KEY `id_parent` (`id_parent`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
--
-- Contenu de la table `server`
--
INSERT INTO `server` (`id`, `number`, `id_parent`) VALUES
(1, 'OM25', NULL),
(2, 'OM26', NULL),
(3, 'OM27', NULL),
(4, 'OM26a', 2),
(5, 'OM26b', 2),
(6, 'OM26c', 2);
-- --------------------------------------------------------
--
-- Structure de la table `server_to_server`
--
-- Création: Lun 08 Septembre 2008 à 23:16
--
CREATE TABLE `server_to_server` (
`id_server1` int(10) NOT NULL,
`id_server2` int(10) NOT NULL,
PRIMARY KEY (`id_server1`,`id_server2`),
KEY `id_server2` (`id_server2`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Contenu de la table `server_to_server`
--
INSERT INTO `server_to_server` (`id_server1`, `id_server2`) VALUES
(2, 1),
(3, 1),
(1, 2),
(3, 2),
(1, 3),
(2, 3);
-- --------------------------------------------------------
--
-- Structure de la vue `child_parent_server_list`
--
CREATE VIEW `child_parent_server_list` AS select `s1`.`id` AS `id`,`s1`.`number` AS `number`,`s1`.`id_parent` AS `id_parent`,`s2`.`number` AS `number_parent` from (`test`.`server` `s1` join `test`.`server` `s2` on((`s1`.`id_parent` = `s2`.`id`))) where (`s1`.`id_parent` is not null) order by `s1`.`id_parent`,`s1`.`id`;
-- --------------------------------------------------------
--
-- Structure de la vue `server_to_server_list`
--
CREATE VIEW `server_to_server_list`
AS select distinct `s`.`id` AS `id`,`s`.`number` AS `number`,if((`r`.`id_server1` <> `s`.`id`),`r`.`id_server1`,`r`.`id_server2`) AS `friend`
from (`test`.`server` `s` join `test`.`server_to_server` `r` on(((`s`.`id` = `r`.`id_server1`) or (`s`.`id` = `r`.`id_server2`)))) where isnull(`s`.`id_parent`) order by `s`.`id`;
--
-- Contraintes pour les tables exportées
--
--
-- Contraintes pour la table `server`
--
ALTER TABLE `server`
ADD CONSTRAINT `server_ibfk_1` FOREIGN KEY (`id_parent`) REFERENCES `server` (`id`)
ON DELETE SET NULL ON UPDATE CASCADE;
--
-- Contraintes pour la table `server_to_server`
--
ALTER TABLE `server_to_server`
ADD CONSTRAINT `server_to_server_ibfk_1` FOREIGN KEY (`id_server1`) REFERENCES `server` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `server_to_server_ibfk_2` FOREIGN KEY (`id_server2`) REFERENCES `server` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
J'ai une idée.
Tu mets une seule table pour stocker les infos des tes serveurs quelque soit leur rang dans la
hiérarchie et pour distinguer les fils des parents tu ajoute dans cette même table un champ
"id_parent" qui désigne l'id du serveur père d'un serveur fils. Les serveurs pères suprêmes n'ayant
pas de père se voit attribués la valeur NULL dans leur champ "id_parent"
En ce qui concerne le lien non hiérarchique qui peut exister entre serveurs de même rang, il faut
créer une seconde table où on peut associer les serveurs amis deux à deux sachant que pour une
liaison bidirectionnelle on aura 2 enregistrements maxi pour 2 même serveurs associés et pour les
liaisons unidirectionnelle on en aura 1 enregistrement maxi. Mais bon en s'en fou pour l'instant.
Voici donc la structure de cette solution, agrémentée par 2 requêtes qui vérifient l'objectif à savoir :
[list]
La liste des serveurs amis ayant un rang hiérarchique équivalent (server_to_server_list)
Le liste des sous-serveurs reliés hiérarchiquement à leurs parents (child_parent_server_list)
[/list]
Script SQL:
[code]
-- phpMyAdmin SQL Dump
-- version 2.11.6
-- http://www.phpmyadmin.net
--
-- Serveur: localhost
-- Généré le : Mar 09 Septembre 2008 à 00:05
-- Version du serveur: 5.0.51
-- Version de PHP: 5.2.6
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
--
-- Base de données: `test`
--
-- --------------------------------------------------------
--
-- Structure de la table `server`
--
-- Création: Lun 08 Septembre 2008 à 23:16
--
CREATE TABLE `server` (
`id` int(10) NOT NULL auto_increment,
`number` varchar(10) NOT NULL,
`id_parent` int(11) default NULL,
PRIMARY KEY (`id`),
KEY `id_parent` (`id_parent`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;
--
-- Contenu de la table `server`
--
INSERT INTO `server` (`id`, `number`, `id_parent`) VALUES
(1, 'OM25', NULL),
(2, 'OM26', NULL),
(3, 'OM27', NULL),
(4, 'OM26a', 2),
(5, 'OM26b', 2),
(6, 'OM26c', 2);
-- --------------------------------------------------------
--
-- Structure de la table `server_to_server`
--
-- Création: Lun 08 Septembre 2008 à 23:16
--
CREATE TABLE `server_to_server` (
`id_server1` int(10) NOT NULL,
`id_server2` int(10) NOT NULL,
PRIMARY KEY (`id_server1`,`id_server2`),
KEY `id_server2` (`id_server2`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
--
-- Contenu de la table `server_to_server`
--
INSERT INTO `server_to_server` (`id_server1`, `id_server2`) VALUES
(2, 1),
(3, 1),
(1, 2),
(3, 2),
(1, 3),
(2, 3);
-- --------------------------------------------------------
--
-- Structure de la vue `child_parent_server_list`
--
CREATE VIEW `child_parent_server_list` AS select `s1`.`id` AS `id`,`s1`.`number` AS `number`,`s1`.`id_parent` AS `id_parent`,`s2`.`number` AS `number_parent` from (`test`.`server` `s1` join `test`.`server` `s2` on((`s1`.`id_parent` = `s2`.`id`))) where (`s1`.`id_parent` is not null) order by `s1`.`id_parent`,`s1`.`id`;
-- --------------------------------------------------------
--
-- Structure de la vue `server_to_server_list`
--
CREATE VIEW `server_to_server_list`
AS select distinct `s`.`id` AS `id`,`s`.`number` AS `number`,if((`r`.`id_server1` <> `s`.`id`),`r`.`id_server1`,`r`.`id_server2`) AS `friend`
from (`test`.`server` `s` join `test`.`server_to_server` `r` on(((`s`.`id` = `r`.`id_server1`) or (`s`.`id` = `r`.`id_server2`)))) where isnull(`s`.`id_parent`) order by `s`.`id`;
--
-- Contraintes pour les tables exportées
--
--
-- Contraintes pour la table `server`
--
ALTER TABLE `server`
ADD CONSTRAINT `server_ibfk_1` FOREIGN KEY (`id_parent`) REFERENCES `server` (`id`)
ON DELETE SET NULL ON UPDATE CASCADE;
--
-- Contraintes pour la table `server_to_server`
--
ALTER TABLE `server_to_server`
ADD CONSTRAINT `server_to_server_ibfk_1` FOREIGN KEY (`id_server1`) REFERENCES `server` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
ADD CONSTRAINT `server_to_server_ibfk_2` FOREIGN KEY (`id_server2`) REFERENCES `server` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
[/code]