Лучший способ хранения нескольких флагов в базе данных

У меня есть веб-приложение, которое уведомляет пользователей о действиях на сайте по электронной почте. Пользователи могут выбирать типы уведомлений, которые они хотят получить. До сих пор существует около 10 различных вариантов (каждый из них является истинным/ложным).

В настоящее время я храню это в одном поле varchar в виде 0 или 1, разделенных запятыми. Например: 1,0,0,0,1,1,1,1,0,0

Это работает, но трудно добавить новые флаги уведомлений и следить за тем, какой флаг принадлежит уведомлению. Есть ли принятый стандарт для этого? Я думал о добавлении другой таблицы со столбцом для каждого типа уведомления. Затем я могу добавить новые столбцы, если мне нужно, но я не уверен, насколько это эффективно.

Спасибо заранее!

Ответ 1

Я бы использовал две таблицы. Одна таблица хранит пользовательские данные, а другая - уведомления, на которые они подписываются. Вторая таблица будет выглядеть примерно так:

create table notifications (
   user_id int,
   notification_type int
);

Я бы установил связь FK между user_id и идентификатором пользователя в таблице users с каскадом при удалении. Используйте как user_id, так и notification_type в качестве первичного ключа. Чтобы проверить, хочет ли пользователь конкретное уведомление, просто выполните соединение между двумя таблицами и выберите строки, в которых идентификатор_видео соответствует соответствующему запросу. Если результирующий набор не пуст, пользователь хочет получить уведомление.

Добавление новых уведомлений становится тривиальным (как и удаление). Просто добавьте (удалите) новое значение типа и дайте пользователям возможность принять его или нет. Если вы хотите сохранить типы уведомлений в таблице для управления через приложение, которое будет работать, но это будет немного сложнее.

Ответ 2

Я бы использовал 10 разных полей бит или bool. Но если вы собираетесь делать это в одном поле, вы можете использовать растровое изображение 0x1111111111 как большое целое или текстовое поле без запятой. Я работал над различными приложениями, используя все эти методы. Но я бы просто пошел с несколькими полями. Гораздо проще делать отборные предложения.

Ответ 3

Использование MySQL?

Тогда тип данных SET - это ответ.

"Тип данных MySQL SET хранится как целочисленное значение в таблицах MySQL и занимает от одного до восьми байтов в зависимости от количества доступных элементов". - http://dev.mysql.com/tech-resources/articles/mysql-set-datatype.html"

Ответ 4

Я бы предположил, что позволить управлять БД с помощью столбцов Bool будет лучше. Я, кажется, помню, что некоторые системы будут упаковывать bools в биты (нуль может испортиться). Чтобы избежать беспорядка, вы можете сделать его отдельной таблицей.

(я не DBA)

Изменить: slaps head "Я только что предложил именно то, что вы делаете": b

Ответ 5

Если вы решили использовать поле бит, например, упомянутый @stephenbayer, вы всегда можете использовать представление в таблице, чтобы упростить работу разработчиков. Это означает, что вы по-прежнему сохраняете экономию пространства бит и простоту использования отдельных столбцов в поле и избегаете необходимости анализировать столбец.

Как уже упоминалось, отдельная таблица является отличным вариантом, если вы хотите, чтобы ваше решение было более расширяемым. Единственный недостаток - немного повышенная сложность.

Это компромисс. Если вы хотите что-то, что действительно легко реализовать, и быстро рассмотрите поле бит. Если вы хотите что-то, что легче расширить и поддерживать за счет чуть большей сложности, то, во что бы то ни стало, выходите за отдельную таблицу. Если голоса сообщают вам все, что вы, вероятно, захотите следовать за отдельной реализацией таблицы.