Qual é a melhor maneira de armazenar os dias da semana em que um evento ocorre em um banco de dados relacional?

Estamos escrevendo um produto de gerenciamento de registros para escolas e um dos requisitos é a capacidade de gerenciar os horários dos cursos. Eu não olhei o código de como lidamos com isso (estou em um projeto diferente no momento), mas mesmo assim comecei a me perguntar como lidar melhor com uma parte específica desse requisito, como lidar com o fato de que cada curso pode ser realizado em um ou mais dias da semana e a melhor forma de armazenar essas informações no banco de dados. Para fornecer algum contexto, um esqueletoCourse A tabela pode conter as seguintes colunas:

Course          Example Data
------          ------------

DeptPrefix      ;MATH, ENG, CS, ...
Number          ;101, 300, 450, ...
Title           ;Algebra, Shakespeare, Advanced Data Structures, ...
Description     ;...
DaysOfWeek      ;Monday, Tuesday-Thursday, ...
StartTime       
EndTime           

O que eu quero saber é: qual é a melhor maneira de lidar com oDaysOfWeek coluna neste exemplo (artificial)? O problema que estou enfrentando é que é um campo com vários valores: ou seja, você pode fazer um curso em qualquer dia da semana e o mesmo curso pode ser realizado em mais de um dia. Sei que certos bancos de dados oferecem suporte nativo a colunas com vários valores, mas existe uma "prática recomendada" para lidar com isso, desde que o banco de dados não o suporte nativamente?

Eu vim com as seguintes soluções possíveis até agora, mas estou me perguntando se alguém tem algo melhor:

Possível solução 1: tratar DaysOfWeek como um campo de bits

Esta foi a primeira coisa que me veio à cabeça (não tenho certeza se isso é bom ou não ...). Nesta solução,DaysOfWeek seria definido como um byte, e os primeiros 7 bits seriam usados para representar os dias da semana (um bit para cada dia). Um bit 1 indica que uma aula foi realizada no dia da semana correspondente.

Prós: Fácil de implementar (o aplicativo pode lidar com as manipulações de bits), funciona com qualquer banco de dados.

Contras: Mais difícil escrever consultas que usam oDaysOfWeek coluna (embora você possa lidar com isso no nível do aplicativo ou criar visualizações e procedimentos armazenados no banco de dados para simplificar isso), quebra o modelo de banco de dados relacional.

Solução possível # 2: armazene DaysOfWeek como uma sequência de caracteres

Essa é essencialmente a mesma abordagem que o uso de um campo de bits, mas, em vez de lidar com bits brutos, você atribui uma letra exclusiva a cada dia da semana e oDaysOfWeek A coluna apenas armazena uma sequência de letras indicando em que dias um curso é realizado. Por exemplo, você pode associar todos os dias da semana a um código de um caractere da seguinte maneira:

Weekday      Letter
-------      ------

Sunday       S
Monday       M
Tuesday      T
Wednesday    W
Thursday     R
Friday       F
Saturday     U

Nesse caso, um curso realizado na segunda, terça e sexta-feira teria o valor de'MTF' paraDaysOfWeek, enquanto uma aula realizada apenas às quartas-feiras teria umDaysOfWeek valor de'W'.

Prós: Mais fácil de lidar em consultas (ou seja, você pode usarINSTR, ou seu equivalente, para determinar se uma aula é realizada em um determinado dia). Funciona com qualquer banco de dados que suporte INSTR ou uma função equivalente (a maioria, eu acho ...). Também é mais amigável e fácil de ver de relance o que está acontecendo nas consultas que usam o métodoDaysOfWeek coluna.

Contras: O único "golpe" real é que, como a abordagem de campo de bits, isso quebra o modelo relacional armazenando um número variável de valores em um único campo.

Solução possível # 3: use uma tabela de pesquisa (feia)

Outra possibilidade seria criar uma nova tabela que armazene todas as combinações únicas de dias da semana e tenha oCourse.DaysOfWeek coluna simplesmente seja uma chave estrangeira para esta tabela de pesquisa. No entanto, essa solução parece ser a mais deselegante, e eu só a considerei porque parecia a The Relational WayTM fazer coisas.

Prós: É a única solução "pura" do ponto de vista relacional do banco de dados.

Contras: É deselegante e complicado. Por exemplo, como você projetaria a interface do usuário para atribuir dias da semana correspondentes a um determinado curso em torno da tabela de pesquisa? Duvido que um usuário deseje lidar com as escolhas ao longo das linhas "Domingo", "Domingo, Segunda", "Domingo, Segunda, Terça", "Domingo, Segunda, Terça, Quarta" e assim por diante ...

Outras idéias?

Então, existe uma maneira mais elegante de lidar com vários valores em uma única coluna? Ou seria suficiente uma das soluções propostas? Pelo que vale, acho que minha segunda solução é provavelmente a melhor das três possíveis soluções que descrevi aqui, mas ficaria curioso para ver se alguém tem uma opinião diferente (ou realmente uma abordagem completamente diferente).

questionAnswers(6)

yourAnswerToTheQuestion