Eu escolheria sua segunda opção, armazenando apenas o valor de substituição nos registros de amostra quando for diferente do limite do projeto (armazenado no registro do projeto).
Essa parece ser a solução mais limpa para mim (armazenando informações sobre o projeto com o registro do projeto e os dados específicos da amostra com a amostra), mas, mais importante, há um problema com sua primeira opção.
Por exemplo, se você armazenar o limite do projeto nas amostras onde não há limite específico de amostra e você tiver um limite de projeto de 5:
| Sample Name | Threshold |
| Sample A | 5 |
| Sample B | 5 |
| Sample C | 5 |
Você atualiza o Sample C para ter um limite de 6:
| Sample Name | Threshold |
| Sample A | 5 |
| Sample B | 5 |
| Sample C | 6 |
Você atualiza o limite do projeto para 6:
| Sample Name | Threshold |
| Sample A | 6 |
| Sample B | 6 |
| Sample C | 6 |
Se você quiser mudar o limiar do projeto, você não pode distinguir C de A e B, o que significa que ele também será alterado de volta para 5, o que pode não ser o que você deseja.
Você poderia armazenar um sinalizador para indicar que o limite é específico da amostra para evitar essa situação, mas isso parece redundante quando comparado ao armazenamento do limite do projeto no projeto e ter nulos no limite de amostra, a menos que seja definido.