Modelo de banco de dados adequado para um sistema de feedback do usuário (um caso interessante)

Estou desenvolvendo um aplicativo usando PHP e Yii Framework. Eu estive pensando sobre a estrutura de banco de dados mais adequada para a funcionalidade fornecida e aqui está o que eu criei. No entanto, não tenho 100% de certeza de que é assim que deve ser feito, então decidi perguntar à comunidade.

Descrição da aplicação:

Usuários registrados podem participar de um evento. Todo evento pode ter um número ilimitado de usuários, chamado "participantes do evento").

Depois que o evento termina, todo participante pode deixar um feedback sobre todos os outros participantes do mesmo evento.

Estrutura do banco de dados:

Como todo evento pode ter um número ilimitado de usuários e os usuários podem participar de um número ilimitado de eventos, criei uma tabela "Participante", que resolve a relação de muitos para muitos.

Outras tabelas são auto-explicativas.

E aqui está a coisa mais importante:

Todo participante de um evento pode ter o número máximo de feedbacks, igual ao número de participantes do mesmo evento, excluindo o participante especificado (por exemplo, se houver 5 participantes do evento, o participante determinado pode receber 4 feedbacks de participantes do mesmo evento) evento).

Deixe-me enfatizar, apenas os participantes do mesmo evento podem deixar um feedback (e apenas um) sobre o determinado participante.

Abaixo estão as etapas que eu segui para garantir a integridade do banco de dados:

Eu criei a coluna "id" na tabela "Participante" para fornecer um ID exclusivo para todos os usuários que participam de um determinado evento. Esse ID é composto (ID do usuário e ID da prática concatenados juntos). Portanto, o ID do participante 23 que participou do evento 14 seria 14-23.

Você pode perguntar por que decidi criar uma coluna separada com esse ID em vez de simplesmente definir a chave primária como esta:

PRIMARY KEY (user_id, event_id)

Leia.

Quando o evento termina, cada participante pode deixar um feedback sobre os outros. Agora, esse ID de participante pode ser referência pelas chaves estrangeiras "sender_id" e "destinatário_id" na tabela de comentários.

Além disso, a chave primária da tabela de feedback também será formada pela combinação de "o ID do remetente" e o "ID do destinatário"; portanto, se o usuário 23 quiser deixar um feedback sobre o usuário 45 (ambos participaram do evento 71), o A chave primária para o feedback seria: 71-45-71-23.

Essa abordagem nos permite garantir, no nível do banco de dados, que nenhum participante deixe um feedback sobre o mesmo participante duas vezes e que um usuário não possa participar do mesmo evento duas vezes.

Questões:

Essa abordagem tem o direito de existir?Quais são os profissionais e outra maneira melhor de abordar essa funcionalidade?Posso gerar as chaves primárias com base nos valores das outras colunas automaticamente na inserção de registros?