Эффективность во многом зависит от того, что вы делаете. Если вы хотите выполнять запрос на основе имени тега, возможно, будет быстрее, если у вас есть таблица тегов с идентификатором, указанным в таблице тегов и элементов (т. Е. Опция # 2). Однако, если у вас нет тысячи строк, это, вероятно, не будет иметь значения. Если у вас совсем не так много тегов, разница будет еще меньше.
Однако, если вы хотите получить теги по идентификаторам элементов, первый метод намного быстрее. Опять же, я сомневаюсь, что вы заметите.
Есть и другие соображения: целостность данных и нормализация. Если вы используете две таблицы и внешние ключи, вам будет намного проще, если ваш набор тегов будет соответствовать элементам. Если тег удален и вы используете только одну таблицу, старые элементы будут по-прежнему иметь старые теги. Кроме того, гораздо проще получить список уникальных тегов и поддерживать его согласованность. Если у вас есть теги в другой таблице, это открывает целый новый мир организации: вы можете создавать временные метки для создания и изменения тегов, отмечать теги как активные или неактивные (и, возможно, другие статусы) и т. Д.