Структура таблиц БД: хранение списков значений наряду с обычными значениями
Ну как по мне то вариант2 (Создать отдельную таблицу для значений списков.) является оптимальным и стандартным. Обычно от него отходят только в нестандартных ситуациях. Не рекомендую выдумывать велосипед.
Созадйте таблицу

ID ListID Value

где ID — уникальный номер записи в таблице (primary key), ListID — какойто ваш внутренний идентификатор, Value сами понимаете, что. Тогда вы сможете извлеч как одну строку, написав SELECT * From TableName Where ListID = 1 или несколько значений, которые уже и составят для вас список. Узнать, сколько у ваc значений с одним ListID так: SELECT Count( * ) From TableName Where ListID = 1; и не нужно дополнителных полей для отметки список это или нет.

Обратите внимание, что (по вашим вариантам) разделители или мультизначения тоже потом надо будет както обработать, потратив время, и (вероятно) еще раз сделать SELECT, затратив и на него дополнительное время и ресурсы. С моим вариантов у вас будет просто join если потрубется.

Не в коем случае не теряйте уникальный ключ в вашей таблиц, как вы хотите в 3!