2010-07-22 4 views
0

Je développe une application web PHP qui traite des informations sur certaines entreprises. Jusqu'à présent, la conception DB ressemble à ceci:Conception de base de données pour tenir un attribut complexe

CREATE TABLE `group` (
    `group_id` int(10) unsigned NOT NULL auto_increment, 
    `group_name` varchar(50) NOT NULL, 
    PRIMARY KEY (`group_id`) 
) ENGINE=InnoDB; 

CREATE TABLE `company` (
    `company_id` int(10) unsigned NOT NULL auto_increment, 
    `company_name` varchar(50) NOT NULL, 
    `group_id` int(10) unsigned default NULL, 
    PRIMARY KEY (`company_id`), 
    KEY `FK_company_group` (`group_id`), 
    CONSTRAINT `FK_company_group` FOREIGN KEY (`group_id`) REFERENCES `group` (`group_id`) ON DELETE CASCADE ON UPDATE CASCADE 
) ENGINE=InnoDB; 

La conception est trop simpliste et je dois le modifier de sorte qu'il peut contenir les informations réelles sur la classification de l'entreprise. En résumé, une entreprise peut être dans une (et une seule) des quatre situations possibles et peut éventuellement être liée à un autre objet (un groupe ou une autre société); le type et les caractéristiques de l'objet lié dépendent de la situation:

   - Independent   
      /   
      /    
    - Holding/     
/  \     --- Direct -> Group 
/   \    /    
/   \   /    
\    - Dependent ----- Indirect -> Company of "Direct" type      
\          
    \          
    - Subsidiary -> Company of "Holding" type         

Ainsi, une entreprise peut être « indépendant », « Direct », « indirecte » ou « filiale ». Les flèches représentent des liens. (Désolé si les noms ont peu de sens, je traduis de l'espagnol à la volée.)

Je cherche un design DB pour contenir cette information et éviter les incohérences autant que le permet InnoDB (donc vous ne pouvez pas avoir une "filiale" liée à un groupe ou un "direct" lié à une entreprise), en particulier lorsque des mises à jour sont effectuées (vous ne devriez pas être en mesure de transférer une société de portefeuille à une filiale si elle a déjà des filiales).

Pouvez-vous me donner quelques idées? Je ne vais nulle part par moi-même :(

Répondre

0

Faire respecter l'intégrité des données dans MySQL est impossible. MySQL supprime silencieusement les contraintes de vérification. Triggers ne sont pas fiables (par exemple, un déclencheur before insert n'est pas appelé pour une suppression en cascade.) Et même si ils étaient fiables, déclencheurs MySQL ne peut pas empêcher réellement une rangée d'être insérée.

Votre meilleur espoir est une couche au-dessus de MySQL qui applique les règles métier.

+0

peut-être que je ne me suis pas expliquer correctement. Dans l'exemple CREATE TABLE snippet Je joins, vous ne pouvez pas affecter plus d'un groupe à une entreprise: c'est physiquement impossible car il n'y a qu'une seule cellule group_id, c'est en gros le type d'intégrité que je veux veille (avec des clés étrangères pour éviter la suppression des enregistrements parent lorsque cela est possible). Je veux quelque chose de mieux que d'avoir trois colonnes dans la table 'company' (' group_id', 'direct_company_id' et' holding_company_id') et de laisser la tâche à PHP de garder tous les trois NULL sauf un. –

+0

@ Álvaro G. Vicario: Eh bien 'ON DELETE CASCADE' supprime réellement la société enfant si vous supprimez le parent. Vous pouvez appliquer un groupe, mais avec 'not null' et' foreign key' comme seuls outils, l'application d'un ensemble compliqué de règles métier est presque impossible – Andomar

Questions connexes