Quel est le moyen le plus efficace pour stocker un tableau d'entiers dans une colonne MySQL?
J'en ai deux tables
Un:
plant_ID | name.
1 | tree
2 | shrubbery
20 | notashrubbery
B:
area_ID | name | plants
1 | forrest | *needhelphere*
maintenant, je veux le domaine de stocker n'importe quel nombre de plantes, dans un ordre précis et de certaines plantes peut se montrer un certain nombre de fois:. e.g 2,20,1,2,2,20,1
Quel est le moyen le plus efficace de stocker cette variété de plantes?
En gardant à l'esprit j'ai besoin de faire en sorte que si je effectuer une recherche pour trouver des zones avec des plantes 2, je n'ai pas les domaines qui sont les e.g 1,20,232,12,20 (pad avec les principaux 0s?) Quelle serait la requête pour qui?
si ça aide, supposons que j'ai une base de données de plus de 99999999 plantes différentes. Et oui, cette question n'a rien à voir avec les plantes....
Question Bonus
Est-il temps de faire un pas loin de MySQL? Est-il mieux DB pour gérer cela?
Tout moment vous vous sentez le besoin de combiner les données dans un seul champ, coup de pied: Vous êtes à la violation de forme normale et ont besoin d'ajouter un autre tableau pour gérer correctement la situation. (Voir le Matchu et mgrove réponses ci-dessous).
si vous vous intéressez un non-relationnelles moyen de stocker ces données (c'est à dire une véritable collection/tableau), regarder dans un OODBMS comme db4o.
Question: Vous pouvez prendre un coup d'oeil à MongoDB
Étant donné que vous avez donc beaucoup de plantes, plusieurs-à-plusieurs sans doute mieux, mais si vous avez eu moins de plantes, vous pourriez envisager de PostGres, qui a de la Matrice de types de champs: postgresql.org/docs/8.0/static/arrays.html -- je vais aller sur une branche et dire que la normalisation n'est pas toujours la bonne réponse.
OriginalL'auteur Moak | 2010-07-16
Vous devez vous connecter pour publier un commentaire.
Si vous allez être à la recherche à la fois en forêt et en usine, on dirait que vous pourriez bénéficier d'un plein sur plusieurs-à-plusieurs relations. Fossé vos
plants
de la colonne et de créer une toute nouvelleareas_plants
table (ou ce que vous voulez l'appeler) de lier les deux tables.Si la zone 1 a des usines 1 et 2, et de la zone 2 a des plantes 2 et 3, votre
areas_plants
tableau devrait ressembler à ceci:Vous pouvez ensuite rechercher les relations de chaque côté, et de l'utilisation simple des Jointures pour obtenir les données pertinentes à partir d'un tableau. Pas besoin de bricolons dans des conditions similaires à la figure si il est dans la liste, bla, bleh, beurk. J'y ai été pour une ancienne base de données. Pas de plaisir. Utiliser SQL pour son plus grand potentiel.
je suis allé de l'avant et de l'ajout de la colonne. Il aide à se tromper sur le côté de pédant pour db conception de noobs, je pense.
Seule chose que j'ai à ajouter, c'est que le
area_id
etplant_id
devrait être la clé primaire de la table - une contrainte unique/l'indice de la prochaine meilleure chose, sauf si vous voulez permettre dupliquer des combinaisons...Re #1: C'est correct, sans chaque ligne étant une unique artificielle de la clé, vous pouvez constater que le meilleur moyen d'économiser de données est d'abord de supprimer, puis insérez-la de nouveau. C'est bien, assurez-vous que vous utilisez une opération (et une transaction sûre table de moteur, comme InnoDB). Re #2, oui, c'est toujours la solution optimale.
Compte tenu de votre description, le lien du tableau ("la table" Poneys " commentaire) sont uniques (ou même primaire) clé (area_id, sort_idx) et un index supplémentaire sur plant_id.
OriginalL'auteur Matchu
Comment à ce sujet:
tableau: les plantes
tableau: les zones
table: area_plant_map
C'est le standard normalisé de manière à faire (avec une table de correspondance).
Pour trouver toutes les régions à des arbustes (usine 2), faites ceci:
Voir la question de la Zone 1 peut avoir cette séquence de plantes: 2,20,1,2,2,20,1 (donc zone 1 a 3 arbustes à la position 0,3 et 4)
dans ce cas, il suffit de mettre une autre colonne avec un numéro de séquence.
OriginalL'auteur Matthew Groves
Vous savez cela viole forme normale?
Généralement, on aurait un areaplants table: area_ID, plant_ID avec une contrainte unique sur les deux et les clés étrangères des deux autres tables. Ce "lien" table est ce qui vous donne plusieurs-plusieurs ou plusieurs-à-un les relations.
Des requêtes sur cette sont généralement très efficaces, ils utilisent des index et ne nécessitent pas d'analyse de chaînes.
Poneys, oui, mais parfois les gens veulent une clé de substitution sur la table.
Même des gens comme ORM, et Miley Cyrus...
OriginalL'auteur Cade Roux
Votre relation attributs doivent être atomiques, pas composée de plusieurs valeurs comme des listes. C'est trop dur de faire une recherche. Vous avez besoin d'une nouvelle relation que les cartes les plantes à la area_ID et la area_ID/combinaison de plantes est la clé primaire.
OriginalL'auteur BobTurbo
Utiliser plusieurs-à-plusieurs relations:
EDIT:
Juste pour répondre à votre question bonus:
Cela n'a rien à voir avec MySQL. C'était juste un problème avec la mauvaise conception de base de données. Vous devriez utiliser l'intersection des tables et plusieurs-à-plusieurs relations pour les cas comme cela dans tous les SGBD (MySQL, Oracle, MSSQL, PostgreSQL, etc).
plant_id, area_id
n'est pas unique,area_id / sort_idx
serait. J'ai besoin d'être en mesure de garder cette séquence intactearea: 1
->plants: 2,20,1,2,2,20,1
(dans cet ordre)Ajouté sort_idx. plant_id, area_id n'ont pas besoin d'être unique. L'unicité est double de clé primaire.
oui, mais mon point est que la Zone 1 de la Plante - 2 pourrait survenir double (de la même plante deux fois dans la zone, de sorte que le réel de l'unicité de la zone / sort_index. j'ai obtenu ce dont j'avais besoin (double primaire) si vous le modifier, alors il alors, je peux accepter la réponse.
OriginalL'auteur Richard Knop
8 ans après cette question a été posée, voici 2 idées:
1. L'utilisation de json type (lien)
2. Utilisez votre propre codification
Tour
area_id
dans une chaîne de caractères (varchar ou text, votre choix, pensez à la performance), alors vous pouvez représenter des valeurs comme par exemple-21-30-2-4-20-
ensuite, vous pourrez filtrer à l'aide de%-2-%
.Si vous en quelque sorte essayer un de ces, je l'aime si vous avez partagé vos résultats, avec 100 millions de lignes comme vous l'avez suggéré.
--
Rappelez-vous que l'utilisation d'une de ces pauses première règle de normalisation, qui dit
every column should hold a single value
OriginalL'auteur Lemures