Хранить массивы в MySQL? - PullRequest
       13

Хранить массивы в MySQL?

3 голосов
/ 09 января 2010

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

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

альтернативный текст http://img2.pict.com/3a/70/2a/2439254/0/screenshot2b187.png

Ответы [ 6 ]

11 голосов
/ 09 января 2010

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

6 голосов
/ 09 января 2010

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

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

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

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

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

5 голосов
/ 09 января 2010

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

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

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

РЕДАКТИРОВАТЬ: Если бы это был я, и это было то, что я серьезно разрабатывал для других, чтобы использовать (или, если честно, даже для себя), я бы, вероятно, создал бы вторую таблицу поиска, чтобы хранить все ключи как колонны; Черт, если бы вы сделали это, mysql_fetch_assoc() мог бы дать вам нужный массив, просто выполнив быстрый второй запрос (или вы могли бы извлечь их с помощью JOIN ed запроса). Однако, если это просто и быстро, чтобы выполнить любую работу, то сериализованный массив может быть для вас. Если вы действительно, действительно, не заботитесь о том, чтобы когда-либо искать эти данные, я думаю, что правильное отношение столбца к ключу будет превосходным.

2 голосов
/ 09 января 2010

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

1 голос
/ 09 января 2010

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

0 голосов
/ 09 января 2010

Возможно, они используют несколько таблиц с отношениями "многие ко многим", но используют объединения и функцию GROUP_CONCAT MySql для возврата значений в виде массива для этих столбцов в одном запросе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...