¿Cuál es la mejor manera de representar una relación de muchos a muchos en una base de datos?

StackOverflow https://stackoverflow.com/questions/1610411

Pregunta

Si tengo varios usuarios y varias páginas, y cada usuario puede administrar cualquier número de páginas, y cada página puede ser administrada por cualquier número de administradores, ¿cómo podría almacenar todos estos permisos en un base de datos?

Por ejemplo, podría tener un campo en la tabla de usuarios, que es solo una lista delimitada por comas de ID de página, o un campo similar para cada página (administrado por ... etc.). Pero eso requeriría que procese la cadena después de que salga de la base de datos.

Podría dar a cada usuario su propia tabla, con una clave = > tipo de diseño de valor, donde tendría user = > someuser, name = > some guy, permisos = > lo que sea, page_id = > 4, page_id = > 8, page_id = > 12, etc. Pero eso parece desordenado y requeriría permisos adicionales para el mysql usuario.

Suponiendo que el número de páginas será relativamente pequeño (lo será), podría poner un tipo de 'banderas' en la tabla de usuarios, un INT de 32 bits (no habría más de 32 'páginas' en este implementación). pero eso solo permitiría un tipo de privilegio de encendido / apagado.

También he considerado tener una tabla de usuario, y luego cada entrada de usuario apunta a una tabla de permisos para ese usuario, que tendría una fila para cada página con los permisos apropiados para ese usuario, que es más limpia que la otra < !> quot; tabla por usuario " solución que enumeré pero también necesito privilegios adicionales para la cuenta mysql.

¿Alguna otra idea? ¿Cuál, según su experiencia, termina siendo la solución más indolora para esto?

¿Fue útil?

Solución

muchos < - > muchas relaciones generalmente se modelan con una tabla intermedia. En su caso, tendría estas tablas:

User        UserPage       Page
------      -----------    -------
UserID      UserID         PageID
...         PageID         ...

La tabla intermedia (UserPage aquí) es donde almacena información que es específica de ese conjunto de ID (sus permisos, en este caso).

Otros consejos

la forma canónica es tener una tabla intermedia, con solo dos campos: la clave principal de cada una de las tablas conectadas.

Lo que necesita es una tabla de mapeo.

USUARIO ----- < USER_PERMISSIONS & Gt; ----- PÁGINAS

La clave principal para la nueva tabla es una clave compuesta compuesta por user_id y page_id

Esto le dará la mayor flexibilidad y permitirá agregar nuevas páginas sin tener que cambiar su esquema.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top