Как сохранить список данных (например, массив) в ячейке mysql? (но он все еще доступен для поиска)

Я новичок в MySQL, поэтому я, вероятно, просто не знаю, как правильно настроить что-то подобное.

По сути, каждая строка в моей таблице — это разные продукты. У меня есть столбцы для основных вещей, таких как описание...

Но у меня есть массив «ингредиентов» и массив «сколько» в массиве.

По сути, со своей стороны, я могу использовать IngredientsArray[0] howMuch[0], чтобы отобразить ингредиент и его количество.

Итак, я хотел бы сохранить оба этих массива в ячейке для строки еды.

Я слышал, что могу сериализовать массив и сохранить его. Но мне нужно, чтобы он был доступен для поиска.

(Кроме того, нет установленного ограничения на количество ингредиентов, поэтому я не могу иметь столбец для каждого, поэтому я иду по маршруту массива)

редактировать: еще 1 вещь, если это может помочь... сколько никогда не будет ничем иным, как int 0 1 2 3 4 5 6 7 8 9

Каков наилучший способ сделать это?

Я занимаюсь программированием в AS3 и использую AMFPHP для подключения к Mysql.


person brybam    schedule 02.03.2012    source источник


Ответы (4)


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

YOUR_FOOD_TABLE
food_id (PK)
description
...

FOOD_INGREDIENTS
food_id (FK)
ingredient_id (FK)
quantity

INGREDIENTS
ingredient_id (PK)
ingredient_name
person Aaron W.    schedule 02.03.2012
comment
что такое ПК и ФК? кроме того, таблица FOOD_INGREDIENTS... она как-то связана с таблицей ingredients? - person brybam; 03.03.2012
comment
PK — это первичный ключ, а FK — это внешний ключ. Таблица FOOD_INGREDIENTS связывает их вместе, используя столбцы food_id и ingredient_id вместе с сохранением quantity для отношения. - person Aaron W.; 03.03.2012

Гораздо лучше иметь таблицу ингредиентов, содержащую столбец (food_id), который ссылается на идентификатор записи в таблице продуктов питания, и столбцы для названия и количества ингредиентов.

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

person Mark Baker    schedule 02.03.2012
comment
Разве это не было бы неэффективно для моего поискового запроса, например, в таблице продуктов, когда я выполняю поиск, я буду выполнять его в таблице foods, затем мне нужно будет сделать ЛЕВОЕ СОЕДИНЕНИЕ с таблицей ингредиентов, а затем я буду искать в этой таблице. с большим количеством ингредиентов, чтобы пойти, хотя - person brybam; 03.03.2012
comment
Это не будет неэффективно, если его правильно проиндексировать, это будет намного эффективнее, чем хранение массива. Базы данных хорошо справляются с поиском... используйте их правильно, и они облегчат вам задачу... злоупотребляйте ими, и вы очень усложните себе жизнь. - person Mark Baker; 03.03.2012

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

person SuperRod    schedule 02.03.2012

использовать mysql FIND_IN_SET

Перед созданием этого запроса экранируйте значения массива.

$insert_qry = 'INSERT INTO `table` (`ingredients`,`howmuch`) VALUES ("'.implode(',',$ingredientsArray).'", "'.implode(',',$howMuch).'")';

$search_qry = 'SELECT * FROM `table` WHERE FIND_IN_SET("bread",`ingredients`);';

http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_find-in-set

person Fabrizio    schedule 02.03.2012
comment
Имейте в виду, что я согласен со всеми остальными, лучшее решение - создать дополнительную таблицу и использовать JOIN - person Fabrizio; 03.03.2012