2010-08-18 9 views
1

Est-il possible d'utiliser une collection telle qu'un multiset ou un tableau en tant que clé étrangère dans un schéma de base de données?Puis-je (théoriquement) utiliser une collection (par exemple, Array, List) en tant que clé étrangère dans un schéma de base de données relationnelle?

Contexte: Un étudiant propose d'utiliser une telle construction (ne pas utiliser une table de jointure pour la n: association m) pour stocker la structure d'objet suivant dans une base de données

public class Person { 
    String name; 
    List<Resource> res; 
    … 
} 

public class Resource { 
    int id; 
    List<Person> prs; 
    … 
} 

SQL: 2003

+0

Peu importe si c'est possible, ce serait une idée ** terrible **. –

Répondre

2

À mon humble avis, l'étudiant n'a pas compris les concepts relationnels. Je ne sais pas comment les types de collection sont implémentés dans les bases de données d'aujourd'hui, mais ils les stockent probablement dans des tables séparées.

Éditer Si cela était techniquement possible, je doute que ce soit utile. Considérez le langage de requête. Sql est conçu pour les structures relationnelles, je doute que vous puissiez vraiment avoir la même flexibilité et les mêmes possibilités en utilisant les types de collection. Si vous l'aviez, vous ne pourriez plus le lire. Considérez les index. etc.

Les structures relationnelles sont primitives, mais très puissantes et rapides. Vous pouvez faire (presque) tout avec eux. Le type de collection n'est en fait pas nécessaire, bien qu'il puisse être utile dans certains cas. Utiliser des collections (pour les choses relationnelles) serait simplement plus complexe et moins pur.

+0

Merci pour votre réponse rapide. En ce qui concerne une base de données relationnelle pure, je serais d'accord. Mais compte tenu des extensions de sql: 1999 et sql: 2003 je ne suis pas sûr. Les types de données de la clé étrangère et du champ référencé (dans la plupart des cas, la clé primaire) sont-ils les mêmes? – Heiko

+0

J'ai ajouté un autre paragraphe –

+0

... et l'ai reformulé. –

1

En termes simples, j'aurais dit non. Je ne pense pas que cela soit possible dans SQL2003 et dans tous les cas, cela couplerait trop étroitement le code et la structure de la base de données. Rappelez-vous de la bonne pratique de structurer le code afin qu'une modification de votre base de données ne nécessite pas de modification de votre code et vice versa. Comme Stefan l'a dit, vous avez besoin de tables séparées pour les liens Resource et Person with Foreign Key vers les index qui les séparent.

Donc basé sur les classes montrées chaque table aurait besoin de 3 colonnes.

Vous obtiendrez alors vos données de classe en utilisant une requête appropriée à la base de données.

+0

Merci pour votre réponse. La question est plus une question théorique qu'une question pratique. Personnellement, j'utiliserais toujours une table séparée. Les étudiants sont venus avec cette proposition et je veux m'assurer que ce n'est certainement pas possible (en passant, ce n'est pas purement relationnel et ça ne correspond pas à 1NF (Atomicité)) Je n'ai pas pu trouver une déclaration claire comme: "La clé étrangère et le champ référencé doivent être du même type de données" ou "Les tableaux et les multisets ne peuvent pas être utilisés comme (ou faire partie) des clés étrangères" – Heiko

0

En principe, oui vous pouvez implémenter une telle contrainte référentielle. Cela suppose que votre SGBDR permette un type approprié pour l'ensemble des valeurs. Par exemple, il pourrait s'agir d'une valeur de relation si les attributs relation-valeur (RVA) sont supportés.

S'il s'agissait d'un RVA alors la contrainte pourrait facilement être exprimée dans l'algèbre relationnelle/calcul ou son équivalent. Par exemple, vous pouvez le faire dans un SGBDR comme Rel qui supporte le langage Tutorial D. Le faire en SQL sera probablement beaucoup plus difficile - mais alors SQL n'est pas un vrai langage relationnel.

Bien sûr, le fait que vous pouvez le faire ne pas faire nécessairement relationnellement une bonne idée ...

1

Comme David l'a souligné, la théorie permet des valeurs d'attributs pour être d'un type de collection.

Cependant, dans votre cas, qui est juste de modéliser les relations n: m (ai-je raison à ce sujet), cela ne s'applique tout simplement pas.

Si une personne P1 a des ressources associées R1 et R2, la ligne de cette personne serait comme {P1, {R1, R2}}. Si cette colonne collection-typée était une clé étrangère référençant une autre table, cela signifierait qu'il devait y avoir une autre table dans laquelle une ligne est apparue avec la valeur de collection {R1, R2} dans une colonne. Quelle table serait-ce dans votre exemple?

Les attributs de type collection sont surtout utiles si vous avez besoin de gérer des collections vides à côté de collections non vides. Il n'y a pas de jointure relationnelle dans le monde qui fera son équivalent pour vous.