Структурирование MySQL

#mysql #database-design

#mysql #проектирование базы данных

Вопрос:

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

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

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

Комментарии:

1. На некоторые из вопросов, которые я опубликовал, до сих пор нет ответов. Если я приму кого-то, кто не ответил на вопрос, это обесценит модель SO.

2. Достаточно справедливо. Вы один из немногих, у кого есть ответы только на 70% своих вопросов. 🙂

Ответ №1:

Скорее всего, это будет проще и быстрее с отдельной таблицей.

Например, если вы хотите найти все сообщения, отправленные определенному пользователю, это будет простой запрос: WHERE recipient = id . Этот запрос будет выполняться хорошо, потому что он может использовать индекс.

Если вы сохраните его в виде списка идентификаторов, разделенных запятыми, в текстовом поле, вам придется написать запрос, используя, например FIND_IN_SET . Этот запрос не сможет использовать индекс.

Комментарии:

1. Я не думаю, что мне понадобится функциональность для поиска сообщений, которые были отправлены каждому получателю. Но мне, скорее всего, потребуется отобразить, кому оно было отправлено, и был ли ответ или нет. Я начинаю склоняться к отдельной таблице. Что считается достаточно большой таблицей в MySQL. Сколько строк я могу иметь, предполагая, что всего 4 столбца с простыми цифровыми идентификаторами?

Ответ №2:

Я думаю, что обычным подходом было бы иметь таблицы соединений. Итак, если у вас есть Contacts таблица и Messages таблица, вы можете создать ContactMessagesSent таблицу, содержащую первичные ключи обоих Contacts Messages столбцов и as, чтобы отслеживать, какие сообщения были отправлены каким контактам. Вы можете создать другую таблицу соединений ContactMessagesReceived для отслеживания ответов.

Итак

 ContactMessagesSent
--------
contact_id ; // primary key of Contacts
message_id ; // primary key of Messages
...
  

Если вы используете правильное индексирование, оно будет работать хорошо, даже если в таблице много строк.

Комментарии:

1. зависит от того, как вы собираетесь запрашивать таблицу. Вероятно, вы хотите индексировать с помощью contact_id, message_id и обоих (contact_id, message_id)

Ответ №3:

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

Создайте отдельную таблицу перекрестных ссылок, которая привязывает участников к сообщениям, чтобы вы могли выполнять запросы по ней. Затем вы можете добавить поле «Ответил» в эту таблицу, чтобы отметить, ответил ли участник.