Сохранить идентификатор для записи в другой таблице или в массиве в поле

Я занимаюсь 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 - плохая идея. В значительной степени мешает вам присоединяться к таблицам (это все еще возможно, но только с тем типом кода, который вы делаете, чтобы доказать, что это можно сделать, а не использовать).

Другие вопросы по тегам