Хранение массивов в MySQL?

На страницах FQL Facebook он отображает структуру таблицы FQL, вот скриншот ниже, чтобы показать некоторые из них (скриншот ушел).

Вы заметите, что некоторые элементы представляют собой массив, например meeting_sex, meeting_for current_location. Мне просто интересно, как вы думаете, они хранят это как массив в mysql или просто возвращают его как один, из этих данных он действительно заставляет меня думать, что он хранится в виде массива. Если вы думаете, что это так, или если вы сделали подобное, то какой способ сохранить эти элементы в виде массива в 1 поле таблицы, а затем получить его как массив на странице PHP?

alt text http://img.ruphp.com/php/screenshot2b187.png

Существует два варианта хранения в виде массива:

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

Однако для того, что вы хотите сделать, используйте serialize() . Примечание. НЕ ВСЕГДА ВСЕГДА попробуйте выполнить поиск по этим данным в своей родной строковой форме. Гораздо быстрее (и saner) просто перезагрузите его, вызовите unserialize() , а затем выполните поиск по вашим критериям, чем для создания сумасшедшего шаблона поиска, чтобы выполнить ваши ставки.

EDIT: Если бы это был я, и это было то, что я серьезно развиваю для других, чтобы использовать (или даже для себя, чтобы использовать, чтобы быть полностью честным), я бы, вероятно, создал вторую таблицу поиска для хранения всех ключей в виде столбцов; Если вы это сделали, mysql_fetch_assoc() может предоставить вам массив, который вам нужен, просто выполнив быстрый второй запрос (или вы можете извлечь их через запрос JOIN ed). Однако, если это просто быстро и грязно, чтобы выполнить любую работу, тогда вам может понадобиться сериализованный массив. Если вы действительно, на самом деле не заботитесь о том, чтобы когда-либо искать эти данные, правильная связь между колонками и ключами, я думаю, что большинство соглашалось бы, превосходит.

Правильный способ хранения массива в базе данных – это хранить его в виде таблицы, где каждый элемент массива является строкой в ​​таблице.

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

Я гарантирую , что Facebook не хранит эти данные в массивах внутри своей базы данных.

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

FQL обеспечивает хорошо продуманную структуру возврата данных, которая удобна для типа данных, которые вы запрашиваете, поэтому любая часть данных, которая может иметь несколько ассоциаций (например, «meeting_for»), упаковывается в массив до того, как она получает возвращается как результат API.

Как отмечали другие плакаты, единственный способ сохранить структуру языка программирования (например, массив или объект) внутри базы данных (которая не имеет понятия об этих вещах) – это сериализовать ее. Сериализация дорогостоящая, и как только вы сериализуете что-то, вы фактически делаете ее непригодной для индексирования и поиска. Будучи социальной сетью, Facebook должен индексировать и искать почти все, поэтому эти данные никогда не будут существовать в форме массива внутри их основных схем.

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

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

вы можете сериализовать массив, вставить его и затем неэтериализовать его при его получении.

Они могут использовать несколько таблиц с отношениями «многие ко многим», но использовать объединения и функцию GROUP_CONCAT MySql, чтобы возвращать значения в виде массива для этих столбцов в одном запросе.