Comment stocker une liste dans une colonne db

j'aimerais stocker un objet FOO dans une base de données. Disons que FOO contient trois entiers et une liste de " Fruits ".

la liste peut avoir n'importe quelle longueur, la seule chose que je sais est que tous les fruits autorisés sont stockés dans une autre table.

puis-je conserver la liste des fruits dans une colonne?

44
demandé sur Nifle 2009-01-14 22:04:50

6 réponses

dans une base de données relationnelle normalisée, une telle situation est inacceptable. Vous devriez avoir une table de jonction qui stocke une rangée pour chaque ID distinct de L'objet FOO et L'ID du Fruit. L'Existence d'une telle rangée signifie que le fruit est dans cette liste pour le FOO.

CREATE TABLE FOO ( 
  id int primary key not null,
  int1 int, 
  int2 int, 
  int3 int
)

CREATE TABLE Fruits (
  id int primary key not null,
  name varchar(30)
)

CREATE TABLE FOOFruits (
  FruitID int references Fruits (ID),
  FooID int references FOO(id),
  constraint pk_FooFruits primary key (FruitID, FooID)
)

pour ajouter Apple fruit à la liste D'un objet FOO spécifique avec ID=5, vous devez:

INSERT FOOFruits(FooID, FruitID)
SELECT 5, ID FROM Fruits WHERE name = 'Apple'
80
répondu Mehrdad Afshari 2009-01-14 19:14:19

si vous êtes tout à fait sûr de ce que vous faites (c.-à-d. vous n'aurez pas besoin de chercher les valeurs de la liste, par exemple), vous pouvez aussi sérialiser votre objet, ou simplement l'objet list, et le stocker dans une colonne binaire.

juste caractère-séparer les valeurs peut être très bien aussi, et moins cher en termes de sauvegarde et de chargement, mais attention vos données ne contiennent pas le caractère de séparateur, ou s'en échapper (et gérer les échappées en conséquence lors du chargement, etc... La langue de votre le choix peut faire un meilleur travail que toi. ;))

Cependant, pour une solution "correcte", faire ce que Mehrdad décrit ci-dessus.

3
répondu AKX 2009-01-14 19:35:32

son techniquement possible, mais serait très mauvaise conception, imo.

vous pouvez le faire en construisant la chaîne et en la stockant dans un champ nvarchar(max) (si vous utilisez sql server ou son équivalent).

2
répondu E.J. Brennan 2009-01-14 19:11:18

Certaines bases de données permettent à plusieurs valeurs stockées dans une seule colonne d'une ligne unique, mais il est généralement plus facile d'utiliser un tableau distinct.

crée une table avec deux colonnes, une qui contient des pointeurs vers la clé primaire de la table objets, et une qui contient des pointeurs vers la clé primaire de la table fruit. Ensuite, si un objet a trois fruits, il y a trois lignes dans la table object_fruit qui pointent toutes vers le même objet, mais vers trois les différents fruits.

0
répondu Andru Luvisi 2009-01-14 19:10:56

Vous pouvez, mais il sera probablement traitée comme du texte, faire de la recherche dans cette colonne difficile et lente. Vous êtes mieux d'utiliser une table liée.

0
répondu Diodeus - James MacFarlane 2009-01-14 19:11:17
INSERT FOOFruits (FooID, FruitID)
SELECT 5, ID 
FROM   Fruits 
WHERE  name IN ('Apple', 'Orange');
-1
répondu Leigh 2014-02-19 20:35:11