2009-12-24 20 views
5

¿Cuál es su elección para la clave principal en las tablas que representan a una persona (como Cliente, Usuario, Cliente, Empleado, etc.)? Mi primera opción sería un número SSN. Sin embargo, se ha desalentado el uso de SSN debido a problemas de privacidad y diferentes regulaciones. El SSN puede cambiar durante la vida de la persona, por lo que esa es otra razón más.La mejor opción para la clave primaria de la tabla Person

Supongo que una de las funciones de la clave primaria natural bien elegida es evitar la duplicación. No quiero que una persona se registre dos veces en la base de datos. Algunas claves primarias sustitutas o generadas no ayudan a evitar entradas duplicadas. ¿Cuál es la mejor manera de abordar esto?

EDIT:

¿Cuál es la mejor manera de garantizar la unicidad en su solicitud de la entidad persona y puede ser gestionado en el nivel de base de datos con clave principal o restricción de unicidad?

+0

En Oracle PL/SQL le brinda la capacidad de mantener la exclusividad del nivel de la base de datos, ya que puede escribir código sql para manipular la lógica comercial. De hecho, todos los demás dialectos de T-SQL te otorgan ese poder hasta donde yo sé. Sin embargo, este no es un comportamiento estándar para todos los motores sql. La singularidad parece ser un problema de lógica de negocios en sus requisitos. Así que ve por eso en la aplicación. – user114285

Respuesta

3

Como se mencionó anteriormente, utilice un autoincremento como su clave principal. Pero no creo que esta sea tu verdadera pregunta.

Su verdadera pregunta es cómo evitar la duplicación de entradas. En teoría, no hay forma: 2 personas podrían nacer el mismo día, con el mismo nombre, y vivir en el mismo hogar, y no tener un número de seguro social disponible para uno u otro. (Uno podría ser un extranjero visitando el país).

Sin embargo, la combinación de nombre completo, fecha de nacimiento, dirección y número de teléfono suele ser suficiente para evitar la duplicación. Tenga en cuenta que las direcciones pueden ingresarse de manera diferente, las personas pueden tener varios números de teléfono y las personas pueden optar por omitir su segundo nombre o utilizar una inicial. Depende de cuán importante es evitar entradas duplicadas, y qué tan grande es su base de usuarios (y, por lo tanto, la probabilidad de una colisión).

Por supuesto, si puede obtener el SSN/SIN, entonces use eso para determinar la singularidad.

7

No sé qué motor de base de datos que está utilizando, pero (al menos con MySQL - ver 7.4.1. Make Your Data as Small as Possible), usando un entero, el más corto posible, generalmente se considera mejor para actuaciones y los requisitos de memoria.

Usaría un número entero, auto_increment, para esa clave principal.
El ser idea:

  • Si la PK es corta, que ayuda a la identificación de cada fila (que es más rápido y más fácil de comparar dos números enteros de dos cadenas largas)
  • Si una columna utilizada en las claves externas es corto, requerirá menos memoria para las claves externas, ya que es probable que el valor de esa columna se almacene en varios lugares.

Y, a continuación, configure un índice UNIQUE en otra columna, la que determina la unicidad, si eso es posible y/o necesario.


Editar: Aquí hay un par de preguntas/respuestas que pueden interesarle:

+0

¿Cuál sería esa columna y puede garantizar la singularidad de la entidad de la persona en el nivel de la base de datos? – Dan

+3

Lo que hace que una persona sea única es una pregunta más compleja: no el nombre, ni la dirección, ni la fecha de nacimiento, ni ... ;; ¿Tal vez un combinaison de algunos de esos? Como nombre + segundo nombre (no estoy seguro de cómo se llaman en inglés) + apellido + fecha de nacimiento + lugar de nacimiento + sexo ;; esos son generalmente los que se usan en las formas "administrativas", aquí, y no deberían estar tan mal, supongo. –

+0

@dan la única vez que se rompe la garantía es si tiene varios servidores de bases de datos físicas y no tiene la lógica (o replicación) de aplicación correcta para mantener a la persona sincronizada. Para esto, necesita aprovisionar la lógica para mantener el ID de persona globalmente único (nota: no estoy implicando que usted deba GUID) –

1

Utilice un una Utogenerated entero clave primaria, y luego poner una restricción única en cualquier cosa que creas que debe ser único. Pero los SSN son no únicos en el mundo real, por lo que sería una mala idea poner una restricción de exclusividad en esta columna a menos que piense que rechazar clientes porque su base de datos no los aceptará es un buen modelo comercial.

0

Para agregar a @Mark y @Pascal (los números enteros de autoincrement son su mejor opción) - Los SSN son útiles y deben modelarse correctamente. Las preocupaciones de seguridad son parte de la lógica de la aplicación. Puede normalizarlos en una tabla separada, y puede hacerlos únicos al proporcionar un campo con fecha de publicación.

p.s., para aquellos que no están de acuerdo con el punto de `seguridad en la aplicación ', un DB empresarial tendrá un modelo de ACL granular; así que este no será un punto de fricción.

1

Prefiero las llaves naturales, pero una tabla person es una caja perdida. Los SSN no son únicos y no todos tienen uno.

1

Recomendaría una clave sustituta. Agregue todos los índices que necesita para otras claves candidatas, pero mantener la lógica comercial fuera de la clave es mi recomendación.

3

¿Qué atributos están disponibles para usted? ¿De qué le importa su aplicación? Por ejemplo, no pueden nacer dos personas exactamente en el mismo segundo en exactamente el mismo lugar, ¡pero es probable que no tenga acceso a esos datos con ese nivel de precisión! Por lo tanto, debe decidir, a partir de los atributos que tiene intención de modelar, cuáles son suficientes para proporcionar un nivel aceptable de integridad de datos. Elija lo que elija, tiene razón al centrarse en los aspectos de integridad de los datos (evitando la inserción de múltiples filas para la misma persona) de su selección.

Para uniones/Llaves externas en otras tablas, es mejor utilizar una llave sustituta.

He llegado a considerar el uso de la palabra Clave principal como un nombre inapropiado, o en el mejor de los casos, confuso. Cualquier tecla, si se marca como clave principal, alternativo clave, clave única, o índice único, sigue siendo una clave, y requiere que cada fila de la tabla contiene valores únicos de los atributos de la llave. En ese sentido, todas las claves son equivalentes. Lo que importa más (la mayoría) es si son claves naturales (dependientes de atributos de datos de modelo de dominio real significativos) o sustitutos (Independendant de atributos de datos reales)

En segundo lugar, lo que también importa es para qué usa la clave Las claves sustitutas son simples y estrechas y nunca cambian (no hay razón para que no signifiquen nada). Por lo tanto, son una mejor opción para combinaciones o claves externas en otras tablas dependientes.

Pero para garantizar la integridad de los datos y evitar la inserción de múltiples filas para la misma entidad de dominio, son totalmente inútiles ... Para eso necesita algún tipo de clave natural, elegida entre los datos que tiene disponibles, y que tu aplicación está modelando para algún propósito.

La clave no tiene que ser 100% inmutable. Si (por ejemplo) usa Nombre y Número de teléfono y Fecha de nacimiento, por ejemplo, incluso si una persona cambia su nombre o su número de teléfono, simplemente puede cambiar el valor en la tabla. Mientras que ninguna otra fila ya tenga los nuevos valores en sus atributos clave, usted está bien.

Incluso si la tecla que seleccionas solo funciona en el 99.9% de los casos, (digamos que tienes la mala suerte de toparte con dos personas con el mismo nombre y número de teléfono y que casualmente nacieron el mismo día), bueno, al menos Se garantizará que el 99.9% de sus datos sean precisos y consistentes, y puede, por ejemplo, agregar tiempo a su fecha de nacimiento para hacerlos únicos o agregar algún otro atributo a la clave para distinguirlos. Siempre que no tenga que actualizar los valores de los datos en las claves externas en su base de datos debido al cambio (ya que no está utilizando esta clave como un FK en otro lugar) no enfrentará ningún problema importante.

1

Prefiero llaves naturales, cuando se puede confiar.

A menos que esté ejecutando un banco o algo así, no hay ninguna razón para que sus clientes y usuarios le proporcionen un número de seguro social válido, o incluso necesariamente para tener uno. Por lo tanto, por razones comerciales, se ve obligado a desconfiar del número de seguro social en el caso de que lo describa. Un argumento similar sería válido para cualquier llave natural dada a "personas".

No tiene más remedio que asignar una clave artificial (Leer "suplente"). Podría ser un número entero. Asegúrate de que sea lo suficientemente grande como para que no necesites expandirlo muy pronto.

Cuestiones relacionadas