У меня есть две таблицы в MySQL. В таблице Person есть следующие столбцы:
id | name | fruits
fruits
Столбец может содержать нуль или массив строк типа ( «яблоко», «апельсин», «бананового»), или ( «клубника») и т.д. вторая таблица Таблица фруктов и имеет следующие три столбца:
____________________________
fruit_name | color | price
____________________________
apple | red | 2
____________________________
orange | orange | 3
____________________________
...,...
Итак, как мне разработать fruits
столбец в первой таблице, чтобы он мог содержать массив строк, принимающих значения из fruit_name
столбца во второй таблице? Поскольку в MySQL нет типа данных массива, как мне это сделать?
mysql
database-schema
Тонга
источник
источник
Ответы:
Правильный способ сделать это - использовать несколько таблиц и
JOIN
их в ваших запросах.Например:
person_fruit
Таблица содержит одну строку для каждого плода человека , связанного с и эффективно связываетperson
иfruits
таблицы вместе, т.е.Если вы хотите вернуть человека и все его плоды, вы можете сделать что-то вроде этого:
источник
person_id
но разныеfruit_name
. Это фактически реализация теории из ответа Януса.person
таблице, любая информация о фрукте вfruits
таблице и любая информация, конкретно касающаяся отношений между конкретным человеком и конкретным фруктом вperson_fruit
таблице. Потому что в этом примере нет никакой дополнительной информации дляperson_fruit
таблицы только две колонны, первичные ключиperson
иfruits
таблиц. Однако количество определенного фрукта является примером чего-то еще, что может быть указано вperson_fruit
таблице.INT
для ключа вfruits
и только этоINT
вperson_fruit
? Таким образом, имя можно изменить позже, и ему также потребуется меньше места, если у вас не намного больше строк,fruits
чем вperson_fruit
.Причина того, что в SQL нет массивов, заключается в том, что большинству людей он действительно не нужен. Реляционные базы данных (как раз и является SQL) работают с использованием отношений, и в большинстве случаев лучше, если вы назначите одну строку таблицы каждому «биту информации». Например, если вы думаете: «Мне нужен здесь список вещей», вместо этого создайте новую таблицу, связав строку в одной таблице со строкой в другой таблице. [1] Таким образом, вы можете представить отношения M: N. Еще одно преимущество состоит в том, что эти ссылки не загромождают строку, содержащую связанный элемент. И база данных может индексировать эти строки. Массивы обычно не индексируются.
Если вам не нужны реляционные базы данных, вы можете использовать, например, хранилище ключей и значений.
Прочтите о нормализации базы данных , пожалуйста, . Золотое правило гласит: «[Каждый] неключевой [атрибут] должен предоставлять факт о ключе, весь ключ и ничего, кроме ключа». Массив делает слишком много. Он содержит несколько фактов и хранит порядок (который не связан с самим отношением). И производительность оставляет желать лучшего (см. Выше).
Представьте, что у вас есть стол с людьми, и у вас есть стол, за которым звонят люди. Теперь вы можете создать для каждой строки человека список его телефонных звонков. Но у каждого человека много других отношений ко многому другому. Означает ли это, что моя личная таблица должна содержать массив для каждой отдельной вещи, к которой он подключен? Нет, это не атрибут самого человека.
[1]: Ничего страшного, если таблица связывания имеет только два столбца (первичные ключи из каждой таблицы)! Если у самой связи есть дополнительные атрибуты, они должны быть представлены в этой таблице в виде столбцов.
источник
MySQL 5.7 теперь предоставляет тип данных JSON . Этот новый тип данных обеспечивает удобный новый способ хранения сложных данных: списков, словарей и т. Д.
Тем не менее, rrays плохо отображают базы данных, поэтому объектно-реляционные карты могут быть довольно сложными. Исторически люди сохраняли списки / массивы в MySQL, создавая таблицу, которая их описывает, и добавляя каждое значение как свою собственную запись. В таблице может быть только 2 или 3 столбца, а может быть и больше. То, как вы храните этот тип данных, действительно зависит от характеристик данных.
Например, содержит ли список статическое или динамическое количество записей? Останется ли список небольшим или ожидается, что он вырастет до миллионов записей? Будет ли много чтений по этой таблице? Много пишет? Много обновлений? Это все факторы, которые необходимо учитывать при принятии решения о том, как хранить коллекции данных.
Кроме того, хранилища данных Key: Value / хранилища документов, такие как Cassandra, MongoDB, Redis и т. Д., Также являются хорошим решением. Просто помните, где на самом деле хранятся данные (если они хранятся на диске или в памяти). Не все ваши данные должны находиться в одной базе данных. Некоторые данные плохо отображаются в реляционной базе данных, и у вас могут быть причины для их хранения в другом месте, или вы можете использовать базу данных ключ: значение в памяти в качестве горячего кеша для данных, хранящихся где-то на диске, или в качестве временного хранилища для таких вещей, как сеансы.
источник
Следует учесть, что вы можете хранить массивы в Postgres.
источник
В MySQL используйте тип JSON.
Вопреки приведенным выше ответам, стандарт SQL уже почти двадцать лет включает типы массивов; они полезны, даже если MySQL не реализовал их.
Однако в вашем примере вы, вероятно, захотите создать три таблицы: person и fruit, а затем person_fruit, чтобы присоединиться к ним.
Если вы хотите связать человека с множеством фруктов, вы можете сделать это с помощью представления:
В представлении отображаются следующие данные:
В 5.7.22 вы захотите использовать JSON_ARRAYAGG , а не взламывать массив из строки.
источник
Используйте тип поля базы данных BLOB для хранения массивов.
Ссылка: http://us.php.net/manual/en/function.serialize.php
источник
вы можете сохранить свой массив, используя group_Concat, например
ЗДЕСЬ пример на скрипке
источник