Gerenciamento eficaz de alterações de dados

Eu tenho uma tabela chamada Reservas. Esta tabela contém dados que representam uma reserva feita para um serviço específico, com muitas variáveis.

Há algum tempo, deparei com um problema com minha estrutura de dados atual, na qual qualquer alteração na reserva que afetasse horários, datas ou preços afetaria outros registros financeiros associados, listas de reservas de datas etc.

Minha solução na época era criar uma tabela de modificações que rastreasse as alterações feitas em uma reserva. Em seguida, sempre que o modelo de Reserva fosse solicitado a devolver uma reserva, ele adicionaria as Modificações feitas (noafterFind() Retorno de chamada do bolo) e apresente a versão mais atualizada da reserva, algo como isto (desculpe o desenho do Paint):

Esse método funciona bem quando você solicita que o modelo de reserva retorne a reserva nº 1234. Ele retorna a representação mais atualizada da reserva, incluindo todas as modificações (colocadas em camadas umas sobre as outras), incluindo uma matriz que contém todas as modificaçõese os dados da reserva original para referência.

Meu problema é que eu percebi recentemente que preciso consultar este modelo com condições personalizadas e, se uma dessas condições foi realizada em uma das modificações, o resultado não corresponderia porque o modelo estava pesquisando o registro original do que o registro finalmente apresentado. Exemplo onde eu consulto o modelo para retornar linhas ondeabc é azul (não cinza):

Nesse exemplo, o modelo olha diretamente para os dados originais as linhas em queabc é azul e não retorna esse resultado, porque o valor azul está em uma modificação anexadadepois de os resultados originais são encontrados.

O que eu fiz agora é colocar uma consulta no diretóriobeforeFind() retorno de chamada do modelo de reserva para procurar modificações que correspondam aos critérios fornecidos, ingressando na reserva para garantir que outros critérios ainda correspondam. Quando retorna o azul no exemplo acima, ele armazena o resultado em uma matriz como uma propriedade de classe e continua com ofind(), masexclui o ID dessa reserva seja devolvido (porque encontramos uma versão mais atualizada). Em seguida, ele irá mesclá-los, classificá-los novamente etc.afterFind().

Isso funciona, embora seja um pouco mais demorado que eu esperava.

Depois de tudo isso, percebi que em outras partes deste aplicativo, existem modelos que se juntam manualmente à tabela de reservas e procuram por reservas. Então agora eu preciso de uma maneira de poder incorporar as modificações em todas essas junções manuais diretamente na tabela no MySQL sem afetar os dados originais e, de preferência, sem alterar muito o meu código.

Meu pensamento era que eu precisava remover a junção manual e criar uma associação de modelo. ObeforeFind() eafterFind() do modelo de reserva ainda é executado quando eu pergunto o modelo do cliente que possui muitas reservas (para aplicar as modificações em cada reserva)?

Minha outra opção era retornar mais linhas do MySQL do que o necessário, removendo qualquer critério que pudesse estar contido nas modificações e, em seguida, usar o PHP para filtrar os resultados conforme meus critérios de pesquisa. Essa opção me assustou um pouco, porque o conjunto de resultados tem o potencial de ser massivo sem esse critério ...

Como posso conseguir essa estrutura de dados? Meus principais requisitos ainda são que eu não quero alterar o registro de reserva original, mas adicionar registros de modificação na parte superior, mas preciso poder consultar reservas (incluindo modificações) por meio do modelo.

Quero tentar manter o máximo possível dessa integração nos bastidores, para não precisar passar por todo o meu aplicativo para mudarn número de consultas que se parecem com isso:

$get_blue = $this->Booking->find('all', array(
    'conditions' => array(
        'Booking.abc' => 'blue'
    )
));

Desejo poder incluir implicitamente todas as modificações feitas nas reservas para que a reserva atualizada seja retornada na consulta acima.

O outro problema é quando o modelo de reserva é associado manualmente a uma consulta de pesquisa, como esta:

$get_transactions_on_blue_bookings = $this->Transaction->find('all', array(
    'joins' => array(
        array(
            'table' => 'sql_bookings_table', // non-standard Cake format, I know - it's an example
            'alias' => 'Booking',
            'type' => 'LEFT',
            'conditions' => 'Booking.booking_id = Transaction.booking_id'
        )
    ),
    'conditions' => array(
        'Booking.abc' => 'blue'
    )
));

Como você pode ver, a consulta acima não inclui a modificação no meu exemplo MSPaint acima, porque está ingressando manualmente na tabela no SQL (a integração da modificação está nobefore eafterFind() funções de retorno de chamada do modelo de reserva).

Qualquer ajuda neste assunto seria altamente apreciada.

Editar

Sei que isso já é longo o suficiente, mas pensei em acrescentar que o motivo pelo qual desejo acompanhar essas alterações e não atualizar o registro original é que ofinanceiro aspecto não pode mudar, porque afetará os relatórios.

A solução mais rápida e fácil que posso ver até agora é aplicar modificações diretamente à reserva original em todos os casos, exceto quando isso afeta as informações financeiras, que ainda são rastreadas como uma modificação (porque atualmente não preciso pesquisar com base nessas informações )

questionAnswers(4)

yourAnswerToTheQuestion