Как сохранить список в столбце 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');