Modelo de base de datos adecuado para un sistema de comentarios del usuario (un caso interesante)

Estoy desarrollando una aplicación usando PHP y Yii Framework. He estado pensando en la estructura de base de datos más adecuada para la funcionalidad dada y esto es lo que se me ocurrió. Sin embargo, no soy 100% positivo, así es como debería hacerse, así que decidí preguntarle a la comunidad.

Descripción de la aplicación:

Los usuarios registrados pueden participar en un evento. Cada evento puede tener un número ilimitado de usuarios, llamados "participantes del evento").

Una vez que finaliza el evento, cada participante puede dejar un comentario sobre todos los demás participantes del mismo evento.

Estructura de la base de datos:

Como cada evento puede tener un número ilimitado de usuarios y los usuarios pueden participar en un número ilimitado de eventos, he creado una tabla "Participante", que resuelve la relación de muchos a muchos.

Otras tablas se explican por sí mismas.

Y aquí está lo más importante:

Cada participante de un evento puede tener el número máximo de comentarios, que es igual al número de participantes del mismo evento excluyendo al participante dado (Ejemplo, si hay 5 participantes del evento, el participante dado puede recibir 4 comentarios de los participantes del mismo evento).

Permítanme enfatizar que solo los participantes del mismo evento pueden dejar un comentario (y solo uno) sobre el participante dado.

A continuación se detallan los pasos que tomé para garantizar la integridad de la base de datos:

He creado la columna "id" en la tabla "Participante" para dar una identificación única a cada usuario que participe en un evento determinado. Este ID es compuesto (user_id y practice_id concatenados juntos). Entonces, la identificación del participante del usuario 23 que participó en el evento 14 sería 14-23.

Puede preguntar por qué decidí crear una columna separada con esta ID en lugar de simplemente definir la clave primaria de esta manera:

PRIMARY KEY (user_id, event_id)

Sigue leyendo.

Cuando termina el evento, cada participante puede dejar un comentario sobre los demás. Ahora, este ID de participante puede ser referencias mediante las claves externas "sender_id" y "recipiente_id" en la tabla de comentarios.

Más adelante, la clave principal de la tabla de comentarios también se formará combinando "el remitente_id" y el "destinatario_id", por lo que si el usuario 23 desea dejar un comentario sobre el usuario 45 (ambos participaron en el evento 71), el La clave principal para la retroalimentación sería: 71-45-71-23.

Este enfoque nos permite asegurarnos en el nivel de la base de datos de que ningún participante deja un comentario sobre el mismo participante dos veces y que un usuario no puede participar en el mismo evento dos veces.

Preguntas:

¿Este enfoque tiene derecho a existir?¿Cuáles son las ventajas y otras formas mejores de abordar esta funcionalidad?¿Puedo generar las claves primarias basadas en los valores de las otras columnas automáticamente en la inserción de registros?

Respuestas a la pregunta(1)

Su respuesta a la pregunta