2012-02-17 24 views
7

Tengo una tabla de muchos a muchos que almacena un registro para cada función permitida que un usuario pueda tener. Si un usuario actualiza sus roles (agrega y elimina) roles, ¿cómo debo manejar esto?Actualizando en una relación de muchos a muchos

¿Debo borrar primero todos los roles de los usuarios y luego agregar los seleccionados? ¿O hacer algún tipo de coincidencia?

+0

es por eso que tenemos parámetros, pasa el ID de usuario y el ID de rol como un parámetro y luego lo hace: 'ELIMINAR FROM MyTable WHERE ID de usuario = @UIDID Y roleID = @ ID de rollo – JonH

+1

Esto es realmente una mejor pregunta de lo que parece en la superficie. Si tiene una IU que le permite editar los muchos lados de la tabla y la actualiza en modo por lotes cuando el usuario acierta a guardar (en lugar de hacerlo de uno en uno), es posible que otro usuario modifique la tabla debajo de usted para que no esté 'seguro si, por ejemplo, otro usuario agregó roles mientras el usuario actual estaba editando en la interfaz de usuario – JohnFx

Respuesta

6

Hay muchas maneras de pelar este gato, algunas técnicas que se me ocurren:

1. Eliminar todos los papeles y vuelva a insertar
Este es un enfoque directo. Elimine todas las funciones para el usuario y simplemente vuelva a insertar. Normalmente, el usuario solo pertenece a algunas funciones (menos de 10). Además, existe una buena posibilidad de que ningún otro enlace de claves foráneas a esta tabla de muchos a muchos.

2. Realizar un seguimiento de los cambios y se aplican únicamente a los cambios
Esto es más trabajo pero más eficiente, aunque sólo ligeramente en este caso. Herramientas como ORMs hacen que el seguimiento y la aplicación de este tipo de cambios sea muy fácil.

3. Aplicar los cambios a medida que el usuario realiza el cambio
En este caso Asumo que es aceptable para aplicar los cambios DB como los asociados de usuario final del usuario para roles. Quizás es una base de datos local y cada transacción es de corta duración. Pero creo que este es un escenario poco probable.

No creo que haya nada malo en este caso en particular para eliminar y volver a insertar.

1

Si una persona elimina un rol, ¿por qué no pasa userID y roleID y elimina ese registro? ¿Por qué querría eliminar todos los ID de imitación para un userID específico y luego volver a leerlos?

Desde mi comentario anterior, pasar dos parametros: UserID y RoleID

continuación, puede eliminar/extraer esa única tupla.

+0

La forma en que se configura la interfaz de usuario los roles se configuran mediante casillas de verificación donde puede marcar o desmarcar múltiples – chobo

+0

@chobo, así que envíe múltiples parámetros , puede usar 'IN', etc. De cualquier manera, si no hay demasiados roles, puede simplemente eliminar todos y leer solo los marcados. – JonH

+0

@JonH: grueso sobre hablador, ¿verdad? – micahhoover

Cuestiones relacionadas