Сохранить идентификатор для записи в другой таблице или в массиве в поле
Я занимаюсь php/mysql и начал задумываться о том, что будет более эффективным, а какой метод обеспечит лучшую целостность данных.
Я никогда не использовал метод № 2, но я видел его в таких системах, как CMS или eCommerce. Я использую № 1 регулярно.
Пример: при создании "задачи" в моей системе мне нужно назначить 1 ИЛИ нескольких пользователей.
Метод № 1 В этом методе у меня будет таблица, в которой будут храниться и task_id, и user_id. Я бы запросил эту таблицу, чтобы получить отношения.
Метод № 2 В этом методе у меня будет столбец в таблице задач "users_assigned", в котором будет храниться сериализованный массив, который я буду десериализовать, когда мне будет нужно. например
$data = array('John', 'Jack', 'Jill');
// after serialization it would look like...
// a:3:{i:0;s:4:"John";i:1;s:4:"Jack";i:2;s:4:"Jill";}
Какой метод лучше всего подходит для хранения данных этого типа в базе данных?
2 ответа
Если у вас нет веских причин против денормализации (хранение данных, дублированных в сериализованном массиве, нарушение правил обычных форм), я бы придерживался отдельных таблиц. Выборка немного сложнее, требуются объединения, но вы можете лучше контролировать целостность отношений в базе данных (внешние ключи), ваши данные лучше организованы и более четко определены.
Взгляните на эту статью http://backchannel.org/blog/friendfeed-schemaless-mysql для крайнего случая денормализации. В их случае, однако, они не извлекают никаких дополнительных связанных данных в наборы строк (в вашем случае вы, вероятно, захотите объединить больше информации о пользователях в сериализованном массиве).
Способ 2 - плохая идея. В значительной степени мешает вам присоединяться к таблицам (это все еще возможно, но только с тем типом кода, который вы делаете, чтобы доказать, что это можно сделать, а не использовать).