Tenho uma tabela do Access chamada Engagement
com quatro campos:
Emp_id, Year, Week, Act_id
Ele registra quando um funcionário está/estava envolvido em uma atividade. Cada campo é Number e cada um faz parte da chave primária composta. A semântica do aplicativo era que cada entrada (cada Emp_id
- Year
- Week
- Act_id
combinação) deveria ser única. Ou seja, embora um funcionário geralmente tenha diferentes semanas do ano e diferentes atividades, às vezes um funcionário pode se envolver na mesma atividade em diferentes semanas do ano ou até mesmo se envolver em atividades diferentes na mesma semana do ano. Nulos não eram permitidos. Tudo funcionou.
Agora preciso expandir/modificar a semântica para permitir valores ano-semana desconhecidos – ou mais apropriadamente, não divulgados – associados a qualquer atividade de funcionário. Obviamente, tentar inserir uma linha com um ano-semana vazio resulta em "Índice ou chave primária não pode conter um valor nulo". Então eu preciso de uma mudança no design da mesa.
Uma coisa que tentei foi converter o índice de chave primária em um índice não primário desativando Primário (e deixando Único ativado) na janela Índices. Isso evita corretamente registros duplicados onde os valores de Ano-Semana não estão vazios -- mas permite registros duplicados onde Ano-Semana estão vazios.
Por exemplo, usando o índice exclusivo não primário acima, os seguintes dados são permitidos:
Emp_id Year Week Act_id
7 2014 12 31 } Same activity,
7 2015 22 31 } different dates.
7 2015 33 32
7 2015 40 33 } Same dates,
7 2015 40 34 } different activities.
7 2016 2 36
7 38 } Different activities,
7 39 } undisclosed dates.
E nenhuma das seguintes adições são permitidas posteriormente:
Emp_id Year Week Act_id
7 2014 12 31 } Both records are
7 2015 33 32 } duplicates of above.
Até aqui tudo bem (o comportamento corresponde aos requisitos). No entanto, ambas as adições a seguir são permitidas posteriormente, mas não devem ser :
Emp_id Year Week Act_id
7 38 } Both records are
7 39 } duplicates of above.
Por que é que?
Qual é uma boa maneira de contornar esse problema de, por um lado, permitir algo equivalente a nulo para Ano e Semana e, por outro lado, restringir cada Emp_id
- Year
- Week
- Act_id
combinação a ser única?
Posso pensar em duas outras soluções (não testadas):
- Escolha um valor numérico equivalente a nulo, como zero ou -1 e de alguma forma explique isso aos usuários.
- Converta os tipos de campo Ano-Semana de Número para Texto e simplesmente use "" (string vazia) para nulo.
Na sua experiência, qual é uma boa solução para esse tipo de situação?
Estou ciente de O que há de errado com colunas anuláveis em chaves primárias compostas? e valor NULL na chave primária de várias colunas , que explicam certas coisas, mas não fornecem uma solução.