Как сохранить список в столбце db

Я хотел бы сохранить объект FOO в базе данных. Допустим, что FOO содержит три целых числа и список "Фрукты".

Список может иметь любую длину, единственное, что я знаю, это то, что все разрешенные фрукты хранятся в другой таблице.

Можно ли сохранить список фруктов в столбце?

Ответ 1

В нормированной реляционной базе данных такая ситуация неприемлема. У вас должна быть таблица соединений, в которой хранится одна строка для каждого отдельного идентификатора объекта FOO и идентификатора Fruit. Существование такой строки означает, что плод находится в этом списке для 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)
)

Чтобы добавить Apple fruit в список определенного объекта FOO с ID = 5, вы должны:

INSERT FOOFruits(FooID, FruitID)
SELECT 5, ID FROM Fruits WHERE name = 'Apple'

Ответ 2

Если вы совершенно уверены в том, что делаете (например, вам не нужно будет искать значения списка, например), вы также можете сериализовать свой объект или просто объект списка и сохранить его в двоичном столбце.

Простое разделение символов на значения может быть очень хорошим и более дешевым с точки зрения сохранения и загрузки, но будьте осторожны, чтобы ваши данные не содержали символ разделителя или не удаляли его (и соответственно обрабатывать escape-последовательности во время загрузки и т.д... Ваш язык выбора может сделать лучше, чем вы, хотя.))

Однако для "правильного" решения сделайте то, что описано Мехрдадом выше.

Ответ 3

Его технически возможно, но будет очень плохой дизайн, imo.

Вы можете сделать это, построив строку и сохранив ее в поле nvarchar (max) (при использовании SQL-сервера или его эквивалента).

Ответ 4

Некоторые базы данных позволяют хранить несколько значений в одном столбце одной строки, но обычно удобнее использовать отдельную таблицу.

Создайте таблицу с двумя столбцами, которая содержит указатели на первичный ключ таблицы объектов, и таблицу, содержащую указатели на первичный ключ таблицы фруктов. Затем, если объект имеет три плода, в таблице object_fruit есть три строки, которые все указывают на один и тот же объект, но на три разных плода.

Ответ 5

Вы можете, но скорее всего это будет рассматриваться как текст, что затрудняет и замедляет поиск в этом столбце. Лучше использовать связанную таблицу.

Ответ 6

INSERT FOOFruits (FooID, FruitID)
SELECT 5, ID 
FROM   Fruits 
WHERE  name IN ('Apple', 'Orange');