Как хранить массив в mysql

от admin

Как хранить массивы в MySQL?

У меня есть две таблицы в MySQL. Таблица. Пользователь имеет следующие столбцы:

Столбец fruits может содержать нуль или массив строк, таких как ( «яблоко», «оранжевый», «банан» ) или ( «клубника» ) и т.д. Вторая таблица — «Плоды стола» и имеет следующее три столбца:

Итак, как мне создать столбец fruits в первой таблице, чтобы он мог содержать массив строк, которые принимают значения из столбца fruit_name во второй таблице? Поскольку в MySQL нет типа данных массива, как мне это сделать?

6 ответов

Правильный способ сделать это — использовать несколько таблиц и JOIN их в ваших запросах.

Таблица person_fruit содержит одну строку для каждого плода, с которым связан человек и эффективно связывает таблицы person и fruits вместе, I.E.

Когда вы хотите получить человека и все свои плоды, вы можете сделать что-то вроде этого:

Причина, по которой в SQL нет массивов, заключается в том, что большинство людей действительно не нуждается в ней. Реляционные базы данных (SQL — это именно то, что) работают с использованием отношений, и большую часть времени лучше всего назначить одну строку таблицы каждому «бит информации». Например, где вы можете подумать «Мне нужен список вещей здесь», вместо этого создайте новую таблицу, привязывая строку в одной таблице к строке в другой таблице. [1] Таким образом, вы можете представлять отношения M: N. Другим преимуществом является то, что эти ссылки не будут мешать строке, содержащей связанный элемент. И база данных может индексировать эти строки. Массивы обычно не индексируются.

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

Читайте о нормализации базы данных, пожалуйста. Золотое правило: «[Каждый] не-ключ [атрибут] должен обеспечивать факт ключа, всего ключа и ничего, кроме ключа». Массив делает слишком много. Он имеет несколько фактов и хранит порядок (который не связан с самим отношением). И производительность плоха (см. Выше).

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

[1]: Это нормально, если в таблице ссылок есть только два столбца (первичные ключи из каждой таблицы)! Если сама связь имеет дополнительные атрибуты, они должны быть представлены в этой таблице в виде столбцов.

Как хранить массивы в базе данных

При работе с базой данных MySQL иногда нужно сохранить массив в одном поле. К сожалению, нет способа непосредственно передать массив как параметр. В результате, хранение таких структур данных становиться более сложным процессом, но, тем не менее, возможным.

Чтобы конвертировать любой массив (или объект) в строку в PHP, нужно вызвать функцию serialize :

$string содержит строчную версию массива. Выше приведенный пример выведет следующее:

Чтобы конвертировать такую строку обратно в массив, надо использовать unserialize :

Теперь проведём конвертацию массива из 200 случайно генерированных целых чисел в диапазоне от 1 до 1000:

Пример выведет подобную строку:

Данная строка может быть сохранена в базе данных и конвертирована в массив по мере надобности. Очень часто функция base64_encode используется в сочетании с функцией serialize для хранения массивов:

Зашифрованная строка может быть восстановлена в массив с помощью функции base64_decode :

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

Перед использованием, такую строку надо вернуть к обычному виду с помощью функции gzuncompress .

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

Данный урок подготовлен для вас командой сайта ruseller.com
Источник урока: www.lateralcode.com/store-array-database/
Перевел: Сергей Фастунов
Урок создан: 3 Сентября 2010
Просмотров: 96554
Правила перепечатки

5 последних уроков рубрики «PHP»

Фильтрация данных с помощью zend-filter

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

Контекстное экранирование с помощью zend-escaper

Обеспечение безопасности веб-сайта — это не только защита от SQL инъекций, но и протекция от межсайтового скриптинга (XSS), межсайтовой подделки запросов (CSRF) и от других видов атак. В частности, вам нужно очень осторожно подходить к формированию HTML, CSS и JavaScript кода.

Подключение Zend модулей к Expressive

Expressive 2 поддерживает возможность подключения других ZF компонент по специальной схеме. Не всем нравится данное решение. В этой статье мы расскажем как улучшили процесс подключение нескольких модулей.

Совет: отправка информации в Google Analytics через API

Предположим, что вам необходимо отправить какую-то информацию в Google Analytics из серверного скрипта. Как это сделать. Ответ в этой заметке.

Читать:
Почему git не открывает файлы на swift
Подборка PHP песочниц

Подборка из нескольких видов PHP песочниц. На некоторых вы в режиме online сможете потестить свой код, но есть так же решения, которые можно внедрить на свой сайт.

How to store arrays in MySQL?

I have two tables in MySQL. Table Person has the following columns:

id name fruits

The fruits column may hold null or an array of strings like (‘apple’, ‘orange’, ‘banana’), or (‘strawberry’), etc. The second table is Table Fruit and has the following three columns:

fruit_name color price
apple red 2
orange orange 3
———— ——— ——

So how should I design the fruits column in the first table so that it can hold array of strings that take values from the fruit_name column in the second table? Since there is no array data type in MySQL, how should I do it?

7 Answers 7

The proper way to do this is to use multiple tables and JOIN them in your queries.

The person_fruit table contains one row for each fruit a person is associated with and effectively links the person and fruits tables together, I.E.

When you want to retrieve a person and all of their fruit you can do something like this:

Bennik2000's user avatar

Bad Wolf's user avatar

The reason that there are no arrays in SQL, is because most people don’t really need it. Relational databases (SQL is exactly that) work using relations, and most of the time, it is best if you assign one row of a table to each «bit of information». For example, where you may think «I’d like a list of stuff here», instead make a new table, linking the row in one table with the row in another table.[1] That way, you can represent M:N relationships. Another advantage is that those links will not clutter the row containing the linked item. And the database can index those rows. Arrays typically aren’t indexed.

If you don’t need relational databases, you can use e.g. a key-value store.

Read about database normalization, please. The golden rule is «[Every] non-key [attribute] must provide a fact about the key, the whole key, and nothing but the key.». An array does too much. It has multiple facts and it stores the order (which is not related to the relation itself). And the performance is poor (see above).

Imagine that you have a person table and you have a table with phone calls by people. Now you could make each person row have a list of his phone calls. But every person has many other relationships to many other things. Does that mean my person table should contain an array for every single thing he is connected to? No, that is not an attribute of the person itself.

[1]: It is okay if the linking table only has two columns (the primary keys from each table)! If the relationship itself has additional attributes though, they should be represented in this table as columns.

Как хранить массив в mysql

Как хранить массивы в базе данных

При работе с базой данных MySQL иногда нужно сохранить массив в одном поле. К сожалению, нет способа непосредственно передать массив как параметр. В результате, хранение таких структур данных становиться более сложным процессом, но, тем не менее, возможным.

Чтобы конвертировать любой массив (или объект) в строку в PHP, нужно вызвать функцию serialize:
1 $array = array( 1, 2, 3 );
2 $string = serialize( $array );
3 echo $string;

$string содержит строчную версию массива. Выше приведенный пример выведет следующее:
1 a:3:

Чтобы конвертировать такую строку обратно в массив, надо использовать unserialize:
1 // $array будет содержать( 1, 2, 3 )
2 $array = unserialize( $string );

Теперь проведём конвертацию массива из 200 случайно генерированных целых чисел в диапазоне от 1 до 1000:
1 $array = array();
2 for( $i = 0; $i < 200; $i++ )
3 $array[] = mt_rand( 1, 1000 );
4
5 $string = serialize( $array );
6 echo $string;

Пример выведет подобную строку:
1 a:200:

Данная строка может быть сохранена в базе данных и конвертирована в массив по мере надобности. Очень часто функция base64_encode используется в сочетании с функцией serialize для хранения массивов:
1 $string = base64_encode( serialize( $array ) );

Зашифрованная строка может быть восстановлена в массив с помощью функции base64_decode:
1 $array = unserialize( base64_decode( $string ) );

К сожалению, такие строки могут иметь очень большой размер. В таком случае можно использовать функцию gzcompress для сжатия строки (размер сжатой строки существенно меньше):
1 $smallString = gzcompress( $string );

Перед использованием, такую строку надо вернуть к обычному виду с помощью функции gzuncompress.

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

Related Posts