2009-11-19 11 views
1

Je suis en train de trouver un moyen agréable de stocker des compositions de mots de la forme suivante:Comment stocker des compositions de mots dans une base de données relationnelle de manière normalisée?

 
exhaustcleaningsystem 
exhaust cleaning system 
exhaustcleaning system 
exhaust cleaningsystem 

Les combinaisons sont données par défaut par cas. Chaque mot d'une composition est stocké sous forme de ligne unique dans la table "labels".

 
labels 
id value 
-------------------------- 
1 exhaustcleaningsystem 
2 exhaust 
3 cleaning 
4 system 
5 exhaustcleaning 
6 cleaningsystem 

Je pensais à une nouvelle table appelée « compositions »:

 
compositions 
id domain_id range 
---------------------- 
1 1   2,3,4 
2 1   5,4 
etc... 

Mais stocker plusieurs valeurs séparées dans une colonne n'est pas normalisée de conception. Des idées pour ça?

BTW: J'utilise MySQL et ActiveRecord/Rails.

+2

Je pense que nous pourrions aider à mieux avec plus de fond: pourquoi voulez-vous stocker toutes ces combinaisons et que fais-tu avec eux? Et, oui, les valeurs séparées dans une colonne sentent mauvais ... vous aurez du mal à les utiliser avec beaucoup d'outils et aurez beaucoup de code à écrire pour les gérer (même si vous les utilisez juste au même endroit aujourd'hui) – siukurnin

Répondre

0

La conception que vous proposez est même pas dans la première forme normale, puisque gamme n'est pas atomique

Le schéma que je utiliser ici serait

compositions 
id domain_id 
------------- 
1 1 
2 1 

compositions-content 
composition_id  rank  label_id 
------------------------------------------ 
1      1   2 
1      2   3 
1      3   4 
2      1   5 
2      2   4 

avec composition_id référence à un composition.id et label_id référençant label.id

La colonne de rang est optionnelle et devrait être ici si et seulement si la plage que vous définissez ici est sensible à la commande.

Avec cette conception, vous avez une certaine intégrité référentielle au niveau DB.

0

Eh bien, cela est aussi loin que je peux penser en termes de normalisation:

 
sets 
id domain_id 
-------------- 
1 1 
2 1 
etc... 
 
compositions 
id set_id label_id order 
--------------------------- 
1 1  2   1 
2 1  3   2 
3 1  4   3 
4 2  5   1 
5 2  4   2 
etc...