2010-02-17 20 views
7

tengo diferentes 3 tipos de usuarios y cada tipo de usuario puede tener columnas y las relaciones con las tablas que otro tipo no lo hace, pero todos ellos tienen entrada (única) y una contraseña,
¿cómo lo haría:poner el nombre de usuario y la contraseña en una tabla o en varias tablas para cada tipo de usuario?

  • crear una tabla para cada tipo o
  • crear una tabla para todos ellos o
  • crear una tabla para todos ellos sólo para inicio de sesión y contraseña y separar para todas las otras cosas y se unen con un FK
  • algo más
+0

yo diría que depende :) ¿Hay algo más que comparten? ¿Quieres mostrarlos en una página? ¿Pueden los usuarios ser "transferidos"? ¿Puede el mismo usuario existir con dos tipos? –

+0

sí, también pueden compartir nombre, apellido, etc. Un usuario no puede existir con dos tipos. No sé a qué te refieres con transferido, así que supongo que no :). – Omu

+0

pon todo lo que comparten en la misma mesa. Consulte la tabla en http://en.wikipedia.org/wiki/Database_normalization#Normal_forms – chelmertz

Respuesta

2

Tuve esta pregunta exacta cuando construí un sistema reciente. Aquí hay un hilo que fue súper útil para mí: Object-oriented-like structures in relational databases.

Fui con la solución subtipos disjuntos, describe bien aquí: Polymorphism in SQL database tables?

+0

Veo, esa solución, es la perfecta de el punto de vista de las limitaciones, pero creo que va a ser más lento y voy a tener más problemas con todos esos compuestos FK – Omu

+0

noup :), en realidad es mejor, necesito mi DB consistente – Omu

11

número 3 es la mejor de las opciones que se sugieran (actualizado ligeramente de aclaración):

  • crear una tabla para todos ellos de usuario y contraseña y cualquier otra cosa que se comparte y una separada tabla para todas las demás cosas que no se comparten y vincularlas con un FK

Excepto que no almacena la contraseña, almacena una versión hash de una contraseña salada.

Una alternativa podría ser asignar grupos y/o roles a sus usuarios. Esto podría ser más flexible que una estructura de tabla fija, lo que le permite agregar nuevos roles dinámicamente. Pero depende de sus necesidades si esto es útil para usted o no.

Como señaló Aaronaught, en la tabla principal necesita un AccountType para asegurarse de que un usuario solo puede tener uno de los roles. Usted debe Recuerde comprobar el valor de esta columna cuando se une a las tablas para asegurarse de que un usuario tiene solo un rol activo.

Una restricción única en la clave externa asegura que un usuario solo puede tener un rol una vez.

+0

una cosa con esta opción es que no hay ninguna restricción para detener dos filas de 2 tablas de tipos de usuario diferentes para hacer referencia a la misma fila en el " login_password "table – Omu

+1

@Omu: Ponga una restricción' UNIQUE' en esa columna en cada tabla FK, y use una columna discriminatoria ('AccountType') en la tabla principal. Deberías tener el discriminador de todos modos, es crítico para la eficiencia (y Mark, creo que deberías agregar esto). – Aaronaught

+0

@Aaronaught: Buen punto. Cuando originalmente publiqué mi respuesta no estaba claro que cada usuario solo pudiera tener un rol, pero ahora puedo verlo a partir de los comentarios de Omu. –

Cuestiones relacionadas