#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:
Создайте отдельные таблицы. Хранение сериализованной строки элементов было неправильным решением в первую очередь. Выполнение запросов в таком поле является громоздким и медленным.
Создайте отдельную таблицу перекрестных ссылок, которая привязывает участников к сообщениям, чтобы вы могли выполнять запросы по ней. Затем вы можете добавить поле «Ответил» в эту таблицу, чтобы отметить, ответил ли участник.