Tableau de tableaux dans PostgreSQL
Je suis en utilisant le % de % de l'opérateur sur PostgreSQL est hstore
type qui convertit un hstore (clé-type de la valeur efficace) dans un tableau dont les éléments suppléant {{clé, valeur}, {valeur de la clé}}.
Quand je veux revenir tableau de ces aplatie hstores, j'obtiens cette erreur: could not find array type for data type text[]
en raison de PostgreSQL manque de soutien pour un tableau de tableaux.
À partir d'un point de vue de la curiosité, quelqu'un sait-il pourquoi ce ne sont pas pris en charge? Et, plus important encore, est-il un travail autour de ce type de scénario?
Pour le moment je suis la concaténation des résultats dans une chaîne de caractères (séparés par des virgules) et d'analyse sur l'application C# et NPGSQL). Cependant, cette approche ne me sens pas bien, j'aimerais être capable de lire la ligne arrière tant que .NET tableau de tableaux ou un tableau de valeurs-clés, etc.
Merci beaucoup.
OriginalL'auteur harman_kardon | 2012-02-06
Vous devez vous connecter pour publier un commentaire.
Une réponse générique est parce que les tableaux sont intrinsèquement anti-relationnelle. En supprimant les doublons, c'est comment vous atteindre La 1ère forme normale. D'avoir à répéter les groupes de répéter groupes semble assez folle d'un relationnel point de vue théorique.
En général, la manière relationnelle-bonne chose à faire est d'extraire une table pour vos doublons. Donc, si vous avez modelé quelque chose comme ceci:
il vous incombera de redéfinir ce sur le plan relationnel:
Ou encore:
Hstore supporte un grand nombre de fonctions, beaucoup de ce qui serait facile de l'intégrer dans un relationnel de la vision du monde. Je pense que la façon la plus simple pour résoudre votre problème serait d'utiliser la
each
fonction pour convertir votre hstore des valeurs dans les relations que vous pouvez ensuite utiliser comme un simple ensemble de valeurs. C'est la façon dont vous vous adressez à avoir plusieurs valeurs dans d'autres bases de données de toute façon: l'interrogation, et de travailler avec des ensembles de résultats."Une réponse générique est parce que les tableaux sont intrinsèquement anti-relationnelle. En supprimant les doublons, c'est comment vous atteindre 1ère forme normale." Non-sens. Vous mélangez deux définitions différentes de "répétition". Une définition implique la non-unicité/redondance. L'autre implique que vous avez une série de données (une certaine forme de vecteur). Une chaîne de caractères est un tableau de caractères. Cela ne veut pas dire que c'est en interne, en répétant, de licenciement ou d'une mauvaise représentation de la valeur qu'il détient.
Vous confondez la représentation interne avec la représentation relationnelle. Chaque base de données a
varchar
; quelques-uns ont des tableaux. Cela est raisonnable parce que personne n'utilise les chaînes de caractères comme des tableaux. Ils sont traités comme des valeurs atomiques.OriginalL'auteur Daniel Lyons
PostgreSQL a limité "tableau de tableaux" soutien
voir le manuel
C'est une forme restreinte de "tableau de tableaux". Pavel (réponse) le dit, il est nommé "tableau multidimensionnel", mais c'est vraiment une matrice, de sorte qu'il doit avoir le même nombre d'éléments dans chaque dimension.
Vous pouvez utiliser ce type de structure pour la carte multidimensionnelle et de l'hétérogénéité des coordonnées cartésiennes dans des applications scientifiques, mais de ne pas stocker l'arbitraire des vecteurs de vecteurs comme le XML ou JSON de données.
REMARQUE: bien connu en 2 dimensions (2D) homogène tableau est le matrice mathématique. En fait, les applications scientifiques de la matrice qui a motivé la "PostgreSQL contraint tableau multidimensionnel" type de données, et la matrice des fonctions de comportement, avec ce genre de tableaux. Pense à propos de "tableau 3D" comme un "3D matrix", "4D tableau" comme un "4D matrice", et ainsi de suite.
EXEMPLES:
Les commentaires de @Daniel_Lyons sur "pourquoi ce ne sont pas pris en charge" est sur "non-uniforme des tableaux de tableaux" (voir cas d'erreur ci-dessus).
ERROR1
ci-dessus: parce que ne peut concaténer des tableaux de même dimensionERROR2
ci-dessus: tous les tableaux pour une dimension spécifique doit avoir la même longueur, comme une matrice.Une autre chose curieuse à propos de construire-dans des fonctions et des opérateurs: le "comportement par défaut" dans PostgreSQL est pour les tableaux simples et des éléments. Il n'y a pas de surcharge pour la norme
array_append()
,ERROR3
ci-dessus: il n'y a PAS de SURCHARGE d'ajouter "l'élément de tableau" (même 9.2 pg version).ERROR4
ci-dessus: devez utiliser array_cat à "fusionner le tout dans un tableau".La "fusion" de la dernière
array_cat
exemple est curieux, ne produit pas de tableau de tableaux. Utilisationarray_cat(a1, ARRAY[a2])
pour parvenir à ce résultat,Sparse matrix
Pour éviter les problèmes avec sparse matrix et semblables à des structures de données, utilisez la fonction ci-dessous. Il remplit le reste des éléments, puis à NULL (ou de toute valeur constante).
De retrouver les premiers exemples, on peut éviter des erreurs (voir ERROR1),
ARRAY[ROW(g.f1, g.f2)]
exemple sur pg Guide.Pour unnest utiliser les reduce_dim()
OriginalL'auteur Peter Krauss
Support de PostgreSQL un des tableaux multidimensionnels au lieu - les tableaux sont très relative d'un type spécial de bases de données relationnelles et il est un peu limitée contre les langages de programmation. Si vous en avez besoin, vous pouvez utiliser une solution de contournement avec la ligne des tableaux:
OriginalL'auteur Pavel Stehule