Hola Miguel
Justo lo que comentas es el problema real que existe, que la mayoría de los programadores confunde un numero de código o folio con un identificador de registro. Por lo tanto los PK (Primary Key) se usan para diferenciar un registro de otro y a demás para relacionar con otras tablas, permitiendo que las sentencias SQL sean sencillas y optimizadas, si no usan este principio básico pues no están usando las bondades del motor de base de datos, pero como todo en el mundo hay excepciones habría que analizarlas.
Una factura (tabla cabecera) lo natural es que tenga una clave PK, que identifique el registro y a demás tenga un código o folio de factura, pero el error que algunos comenten es usar este código o folio para relacionarlo con otra tabla e incluso usarlo como si fuera el PK y de ahí los problemas de sistema multiusuario, el control de los folio y muchas cosas que se evitan si entienden y aplican el concepto del PK
Una tabla normalizada de factura seria algo así
id (pk)
idsucursal (FK)
folio varchar
Una tabla normalizada de detalle de factura seria así
id (pk)
idFactura (FK id de la tabla factura)
El error común es que lo hacen así
factura
idsucursal (FK)
folio varchar o int
detalle
idsucursal (FK)
idFolio varchar o int
Y otro error incluso cuando usan PK algo así
factura
id (pk)
idsucursal (FK)
folio varchar o int
detalle
id (pk)
idsucursal (FK)
idFolio varchar o int
Como puedes ver al usar Folio como campo relacionado tienes que forzosamente usar el campo de la Sucursal ya que el Join estaría incorrecto puesto que mostraría todas las factura de varias sucursales que el folio sea el mismo, otro pequeño error es usar el campo Folio como numérico, si bien no lo vas a usar para sumar ni restar debería ser carácter o alfanumérico y rellenarlo con Ceros a la izquierda para un mejor ordenamiento y búsqueda.
Respecto a poner todos los huevos en una sola canasta difiero un poco, me refiero a usar un PK mas complicado para proveerme mas información, nuevamente volvemos a caer en la mala interpretación de lo que es un simple identificador a lo que es un código, si me dices que es mejor usar una clave primaria que me permita a simple vista o me permita obtener mas información creo que estamos generando en un principio que la consulta sea mas lenta porque el valor de comparación sera mas grande, si lo que se trata es de optimizar y otro campo me puede dar lo que necesito entonces para que mezclar la función de un identificador con la función de información? es decir el PK solo es y debería usarse para identificar y relacionar un registro pero no que el mismo PK me permita saber que contiene ese registro no se si me explico la idea, es mas el usuario no tiene ni porque saber de la existencia de un PK.
Trabajo mucho con Agencias Aduanales, ellos maneja la famosa REFERENCIA que es un consecutivo del cual muchos agentes aduanales hacen mal uso de este código de identificación, ya que por ejemplo quieren que al ver la Referencia sepan si es una Importación o exportación, de que patente es, de que aduana es, de que cliente es, y volvemos a caer en el concepto equivocado para que son las cosas.
Entonces imaginen que tengo IMP = IMPORTACIÓN, MÉXICO es la aduana 470, el cliente se llama Juan Perez, y la patente es la 9999, entonces me eh llevado la sorpresa de ver referencias así IMP430JUANPEREZ9999-00001 y es valido porque no requieres entrar al sistema para saber de quien es de que aduana es que tipo de operación es, pero no seria mas fácil las 3 iniciales de la aduana MEX dos dígitos del año 99 y un consecutivo algo así MEX99-00001, que visualmente no me dará mucha información pero entonces para que esta el sistema, incluso puede ser un folio consecutivo 0000001111 y con eso debe bastar, entro al sistema tecleo el codigo o folio o referencia y ya veo de quien es, de donde es y que tipo es etc etc etc.
Me puedo ampliar mas pero el PK es para identificar y relacionar solamente, el código o folio es para informar si lo vemos de manera fácil.
saludos
Antonio Meza
saludos
Antonio Meza