Aquí está un ejemplo sencillo:¿Cómo especifico una dirección de envío predeterminada del cliente en una tabla de base de datos?
Supongamos que tengo una tabla de clientes que tiene una relación de uno a varios con la tabla de direcciones (un cliente puede tener múltiples direcciones de envío, pero una dirección de envío sólo puede pertenecer a un solo cliente)
Customer Table
-------------
customer_id (PK)
Address Table
-------------
address_id (PK)
customer_id (FK)
Ahora quiero que cada cliente pueda especificar una dirección de envío predeterminada.
Puedo pensar en 2 maneras pero ambas tienen inconvenientes.
Opción 1
añadir una columna booleana para la tabla de direcciones llamado "is_default".
Pros
- consultas de selección son simples
- sencillo para otras personas a entender si ven el modelo DB
Contras
- La aplicación es fo para aplicar y mantener la restricción de "solo una fila puede ser una predeterminada".
- La actualización del campo predeterminado es un problema porque requiere que la aplicación compruebe y restablezca la opción predeterminada anterior.
Opción 2
Agregar una columna a la tabla de clientes llamado "address_id" y que sea una clave externa (también permiten valores nulos en caso de que no existe ninguna dirección).
Pros
- fácil de actualizar la dirección por defecto si el usuario decide cambiarlo.
- La base de datos mantiene la restricción de "solo una fila puede ser una predeterminada".
Contras
tengo que añadir una nueva columna indexada a la tabla de clientes cada vez que decide añadir algún tipo de metadatos predeterminado.
parece un truco
Mi pregunta es, ¿hay una forma estándar para manejar este tipo de escenario que estoy pasando por alto? Por supuesto, hay otras opciones (¿tal vez crear una tabla de opciones predeterminadas de EAV?), Pero preferiría mantenerlo lo más simple posible porque el cambio se realiza en una base de códigos existente, así que no quiero romper nada.
pensé en eso, pero entonces tendría que crear una nueva "tabla de valores predeterminados" para cada mesa que requiere una tarjeta de crédito predeterminada es decir, las cuentas –
@BillH: ¿Por qué? No hay nada que le impida agregar otra columna, 'default_credit_card_id', que apunta a la tabla Credit_Card. El nombre de la tabla es suficientemente genérico para capturar * todos * los valores predeterminados para el cliente. – Mac