Хранение массива со значениями в базе данных - PullRequest
2 голосов
/ 05 июля 2011

У меня есть следующие данные, которые я хочу сохранить в своей БД (они используются для отправки текстовых сообщений через сторонний API)

text_id, text_message, text_time, (array)text_contacts

text_contacts содержит обычный массив со всеми contact_id *

Как правильно хранить данные в базе данных MySQL?Я думал о двух вариантах:

  1. Создать массив с contact_id в виде строки json_encoded (не нужно сериализовать, поскольку она не многомерна), и сохранить его в текстовом поле в БД.
  2. Создайте вторую таблицу с text_id и всеми контактными идентификаторами в новой строке.

note : данные, хранящиеся в массиве text_contacts, не необходимо менять в любое время.

note2 : данные используются как отдельный contact_id для получения номера телефона от контакта и проверки, действительно ли текстовое сообщение имелобыло отправлено .. (с комбинацией text_id и номера телефона)

Что более эффективно и почему?

Ответы [ 4 ]

3 голосов
/ 05 июля 2011

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

1 голос
/ 05 июля 2011

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

contact_id  |  name
    1       | someone
    2       | someone_else

И таблица текстовых сообщений, которая выглядит следующим образом:

text_id  | text_message  |  text_time | text_contact
   1     |   "Hey"       |   12:48    |      1
   2     |   "Hey"       |   12:48    |      2

Каждый контакт, которому было отправлено сообщениебудет иметь новую запись в таблице текстовых сообщений, причем последний столбец ссылается на поле contact_id таблицы text_contacts.Этот способ значительно упрощает получение сообщений по контактам, поскольку вы можете сказать «выбрать * из text_messages, где text_contact = 1» вместо поиска в каждом из массивов в одной таблице, чтобы найти сообщения, отправленные конкретным пользователем.

1 голос
/ 05 июля 2011

Эта тема принесет немало мнений, но я верю: вторая таблица, во что бы то ни стало.

  1. Если у вас есть случай, когда вам действительно нужно выполнить поиск по этим данным, вам не потребуется анализировать его перед использованием.
  2. Это намного проще для отладки (по той же причине)
  3. json_encode и json_decode (или эквивалент) занимают гораздо больше времени, чем объединение.
  4. Ленивая загрузка проще, даже если в большинстве случаев не нужна.
  5. Другие найдут его более читабельным и, с хорошим определением схемы, его легче будет осмыслить и поддерживать.
1 голос
/ 05 июля 2011

IMO, переходите ко второй таблице, сопоставляя идентификаторы текста с идентификаторами контактов. Будет проще манипулировать, чем хранить все контакты в одном поле

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