La separación de la tabla de usuario de la gente de la tabla en una base de datos relacional

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

  •  01-07-2019
  •  | 
  •  

Pregunta

He hecho muchas aplicaciones web, donde la primera cosa que debe hacer es hacer una tabla de usuarios con nombres de usuario, contraseñas, nombres, e-mails y todos los demás habituales de los restos.Mi proyecto actual presenta una situación en la que los no-usuarios de los registros necesitan para funcionar de manera similar a los usuarios, pero que no necesitan la capacidad para ser un primer pedido de usuario.

Es razonable crear una segunda tabla, people_tb, que es el principal de la tabla relacional y almacén de datos, y utilizar sólo las users_tb para la autenticación?¿La separación de user_tb de people_tb presente algún problema?Si esto se hace comúnmente, ¿cuáles son algunas de las estrategias y soluciones así como los inconvenientes?

¿Fue útil?

Solución

Esta es sin duda una buena idea, como son la normalización de la base de datos.He hecho un diseño similar en una aplicación que estoy escribiendo, donde tengo una tabla de empleados y una tabla de usuario.Los usuarios pueden de una de una empresa externa o a un empleado, por lo que me han separado de tablas, debido a que un empleado es siempre un usuario, pero el usuario no puede ser un empleado.

Los problemas que tendremos es que cada vez que uso la tabla de usuario, usted casi siempre se desea que la persona a la tabla para obtener el nombre u otros atributos comunes que usted quiere mostrar.

Desde un punto de vista de la codificación, si usted está utilizando la recta de SQL, tomará un poco más de esfuerzo mental analizar la instrucción select.Puede ser un poco más complicado si usted está usando un ORM.No tengo suficiente experiencia con aquellos.

En mi solicitud, estoy escrito en Ruby on Rails, así que estoy constantemente haciendo cosas como empleado.usuario.nombre, donde si he mantenido juntos, sería empleado.nombre de la o el usuario.nombre.

Desde un punto de vista del rendimiento, que están golpeando a dos tablas, en lugar de uno, pero teniendo en cuenta índices adecuados, debe ser insignificante.Si usted tuvo un índice que contiene la clave principal y el nombre de la persona, por ejemplo, la base de datos, caería en la tabla de usuario, entonces el índice para la tabla persona (con casi un golpe directo), por lo que el rendimiento sería casi lo mismo que tener una tabla.

También puede crear una vista en la base de datos para mantener ambas tablas se unieron para dar más mejoras en el rendimiento.Sé que en las últimas versiones de Oracle usted puede incluso poner un índice en una vista si es necesario para aumentar el rendimiento.

Otros consejos

Yo habitualmente para hacer eso, porque para mí el concepto de "usuario" (nombre de usuario, contraseña, fecha de creación, fecha de último acceso) es diferente de la "persona" (nombre, dirección, teléfono, correo electrónico).Uno de los inconvenientes que se pueden encontrar es que las consultas a menudo requieren más se une a obtener la información que usted está buscando.Si todo lo que tienes es un nombre de inicio de sesión, deberá unirse a la "gente" de la tabla para obtener el nombre y el apellido, por ejemplo.Si la base de todo lo que rodea el id de usuario de la clave principal, esto es mitigado un poco, pero todavía aparece.

Si user_tb ha auth info, me gustaría mucho mantenerlo separado de people_tb.Yo, sin embargo, mantener una relación entre los dos, y la mayoría de los usuarios de' información se almacenará en people_tb excepto toda la información necesaria para la autenticación (que supongo que no serán utilizados para otra cosa) es un buen equilibrio entre el diseño y la eficiencia del pienso.

Yo siempre trato de evitar en la medida de cantidad de datos de la repetición como sea posible.Si no todas las personas necesitan de inicio de sesión, usted puede tener un genérico people tabla con la información que se aplica tanto a las personas y a los usuarios (por ejemplo.firstname, lastname, etc).

Para las personas que de inicio de sesión, usted puede tener un users tabla que tiene un 1~1 relación con people.Esta tabla puede almacenar el nombre de usuario y contraseña.

Yo diría que ir a por la normalizado de diseño (dos tablas) y sólo denormalize (ir a un usuario/persona de la tabla), si realmente va a hacer su vida más fácil hacia abajo de la línea.Si, sin embargo, prácticamente todas las personas son también usuarios puede ser más sencillo denormalize hasta el frente.Su hasta usted;He utilizado el enfoque normalizado sin problemas.

Muy razonable.

Como un ejemplo, echar un vistazo a la aspnet_* servicios de mesas aquí.

Su construido en el esquema tiene un aspnet_Users y aspnet_Membership con la posterior tabla de tener más información extendida acerca de un determinado usuario (hash de las contraseñas, etc), pero la aspnet_User.UserID se utiliza en otras partes del esquema de integridad referencial etc.

Línea de fondo, es muy común, y un buen diseño, para tener los atributos de una tabla independiente si son de diferentes entidades, como en su caso.

Eso es definitivamente lo que hacemos porque tenemos millones de personas de los registros y sólo miles de usuarios.También hemos separado de direcciones, teléfonos y correos electrónicos en tablas relacionales, como muchas personas tienen más de uno de cada una de estas cosas.Critial es para no depender de nombre como identificador como el nombre no es único.Asegúrese de que las tablas están unidas a través de algún tipo de clave suplente (un entero o un GUID es preferible) no nombre.

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