Nuevamente denotas la mala interpretación de los campos autogenerados y su importancia, FoxtDb es una librería de acceso a datos y usa al 100% PK autogenerados, y es un requisito que todas (TODAS) las tablas tengan un campo PK autoincrementable ya que para eso fueron creados para permitirnos obtener un identificador único por registro de forma nativa generado por el propio manejador de base de datos y no tener que controlarlo por programación.
La pregunta debo usar campos PK autogenerados en todas mis tablas, mi respuesta personal es SI, y si la tabla solo tiene un registro? mi respuesta personal es SI, por que?, porque si en un futuro esa tabla que solo tiene un registro necesito tener mas registros no me interesa saber que campos voy a agregar ya que mi PK me permitirá administrar la tabla, (Agregar, insertar, eliminar) y en cambio si no use un PK y use un campo X para las operaciones y resulta que se debe modificar, pues tengo que reprogramar todo el acceso a esa tabla, sus relaciones si las tiene, etc. Me afecta tener un PK en una tabla con un registro? NO, si no me afecta y me es útil pues mejor lo uso no creen!!
Miguel, como puedes ver los campos PK autoincrementables son para el manejo interno, sin importar los campos claves, folios, códigos que los usuarios utilicen no debe haber relación directa entre ellos, son dos entidades distintas y con usos diferentes, una vez que entiendas esta diferencia amaras a los PK como yo lo hago jajajaj (que cursi me vi)
Ya que tenemos un registro identificado en la tabla por medio de nuestro PK para realizar el CRUD (a excepción de las consultas 'select'), entonces vamos a ver que necesita el usuario, si hablamos de lo mas común una Factura, el usuario te dirá que requiere un folio único por factura, entonces en tu tabla agregas un campo CARACTER para almacenar el folio de la factura, porque es otro error común en el diseño de una base de datos usar campos numéricos en valores que no se van a sumar y en tu tabla de detalles de la factura igual tendrás un PK para identificar el registro del detalle y un campo numérico para almacenar el campo PK de la tabla cabecera de facturas y poder relacionarlos, y listo tablas normalizadas y fácil control y administración. Y no olvidar una tabla auxiliar que solo manejara su campo PK y un campo numérico para ir incrementando el folio de la factura, porque si usan MAX() en multiusuario ya veré los problemas de duplicados o errores.
Pero luego te dice el usuario que ahora necesita que el sistema permita capturar facturas por sucursal, entonces agregas fácilmente un nuevo campo numérico donde guardaras el ID autonumerico de tu tabla catalogo de sucursales, y creas un indice compuesto de tu campo Sucursal + Factura para que no permitas que se duplique un folio por factura y en la tabla auxiliar agregas un campo igual numérico para guardar el Pk de la tabla catalogo de sucursales, para poder obtener el consecutivo por sucursal.
Pasados los meses ahora te dice el usuario que requiere que el sistema genere folios por periodo, es decir que cada año empiece desde CERO el consecutivo de facturas, por lo que agregas un nuevo campo caracter para el periodo y modificas tu campo combinado para que ahora sea Periodo + Sucursal + Factura. y en tu tabla auxiliar agregar el nuevo campo Perido para que puedas incrementar el consecutivo por periodo y sucursal.
Como puedes observar la relación que existe en tu tabla Factura y la tabla Factura detalle nunca se va a necesitar modificar porque no tiene nada que ver la relación de los PK con las modificaciones que te esta solicitando el usuario, ya que insto son dos identidades distintas con distintos fines. De esta manera el diseño de tu base de datos esta normalizada, una estructura muy limpia y facilita el generar las consultas (Select) y las relaciones son por un solo campo lo que genera un código limpio y una velocidad impresionante en la base de datos, a diferencia de un mal diseño como el que Mapner te comento y no le entendiste.
Ahora bien cuando el usuario necesite buscar una factura, sera necesario que le solicites el Periodo, la sucursal y el folio, claramente debes adaptar los indices y claves compuestas según la necesidad, pero internamente no tiene nada que ver con los PK autoincrementables y las relaciones de tus tablas. O que quieres buscar las facturas por cliente, en tu tabla de cabecera Facturas tienes agregado el PK autoincremental del catalogo de clientes y ya puedes hacer la relación fácilmente, si en cambio utilizas un campo consecutivo que generas manual, 001, 002, 003 y con ese relacionaste tu factura con el catalogo de clientes, pues una mala practica, mal diseño, para eso están los PK autoincrementables para facilitar el diseño y relación y muchas muchas cosas internas.
Me dirás que funciona como tu indicas y si claro que funciona, pero no es optimo, sera difícil de mantener y por ejemplo como te decía si el usuario va a consultar o modificar una factura, le solicitas el periodo, sucursal y folio, ya que lo localizaste el registro pues ya tienes el valor del PK, si el usuario modifica algo solo envías un UPDATE WHERE PK = 1 y si no usas los autoincrementables, pues ya veré tu UPDATE Where Periodo = 2015 and sucursal = '001' and Folio = '00005'
Cual Update crees que sera mas rápido? y todo gracias a que existen los PK autoincrementables y que el mismo motor de base de datos los autogenera y solo tienes que utilizarlos para identificar y administrar los registros, y para los requerimientos de los usuarios usas claves, folios, consecutivos, combinados, mezclados, etc etc.
Espero haberme explicado aunque se que faltaron algunos detalles pero si no esto seria una biblia jejeje
Cualquier duda comentarla la analizamos y a demás sirve para los demás personas que visitan el foro vayan aprendiendo y lo que yo tenga mal interpretado si estoy equivocado pues todo lo que sea para mejorar sera bien recibido y seguir aprendiendo.
saludos
Antonio Meza