Как сохранить одно или несколько значений флажков в базе данных? - PullRequest
2 голосов
/ 26 апреля 2011

Поскольку этот вопрос обязательно откроется, я относительно новичок в проектировании баз данных. Прошу прощения за отсутствие понимания.

Я хочу сохранить в базе данных следующие значения (пример из календаря Google):

Google Calendar repeating events

Какой лучший способ сделать это? Это будет одно поле базы данных или несколько?

Если первое, это нарушает правила нормализации?

Спасибо!

Ответы [ 5 ]

1 голос
/ 26 апреля 2011

Я предлагаю вам создать отношение многие-многие, вы можете добиться того, чтобы столбцы были разделены более логичным способом (нормализация) ... для примера выше:

У вас должна быть таблица с названием «расписания» (или что-то еще, что имеет для вас смысл), другая, например, «repeat_on», и третья таблица с именем «дни» (здесь у вас есть понедельник-воскресенье с их идентификаторами). В средней таблице (repeat_on) вы должны создать внешние ключи (для двух других таблиц: schedule_id и day_id), чтобы творить чудеса.

Таким образом, вы можете комбинировать все, что хотите, например:

schedule    day
 1           1
 1           3
 1           7

Это означает, что вы должны делать то же самое в понедельник, среду и воскресенье.

0 голосов
/ 26 апреля 2011

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

Причина, по которой дни недели являются хитрыми, заключается в том, что домен (то есть список дней) довольно мал, и домен никогда не будет расширяться.Кроме того, одним из преимуществ подхода с использованием таблиц пересечений является то, что вы можете выполнить запрос ко всему, что происходит в среду (например).Это замечательно, когда ваша таблица кодов похожа на теги категорий для статей блога, поскольку разумно задать вопрос о просмотре всего с помощью тега How-To.В случае повторения дней недели, имеет ли смысл говорить, показывать мне все, что повторяется по средам?Я так не думаю.Наверняка вы будете запрашивать даты и диапазоны дат, но дни недели и только в контексте повторения?Я не могу придумать практическую причину для этого.

Следовательно, есть аргумент, что дни недели являются атрибутами, а не независимыми объектами, поэтому наличие семибитовых флагов в вашей таблице все еще остается3NF.

0 голосов
/ 26 апреля 2011

Это может быть преувеличено для вашего примера, но вы можете посмотреть следующую статью:

http://martinfowler.com/apsupp/recurring.pdf

Я знаю, что это косвенный ответ, но не повредитчитать.

0 голосов
/ 26 апреля 2011

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

Если можно выбрать более одной опции, у вас должно быть одно поле для опции со значениями 'y' и 'n' (или 't' / 'f' для true / false).Опять же, вы должны добавить ограничение, чтобы разрешить только эти значения.Если ваша СУБД поддерживает это, используйте тип данных BIT, который допускает только 1 и 0.

0 голосов
/ 26 апреля 2011

ИМО, нормализация - это искусство. Однако я обычно беру поля, подобные вашему примеру, и храню их в одной таблице, поскольку у нас никогда не будет больше 7 дней. Однако, если есть вероятность роста, я бы поместил его в отдельную таблицу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...