Je sais que cette question est ancienne, mais elle a retenu beaucoup d'attention au fil des ans et je pense qu'il manque un concept qui pourrait aider quelqu'un dans un cas similaire. Je l'ajoute ici par souci d'exhaustivité.
Si vous ne pouvez pas modifier votre schéma de base de données d'origine, de nombreuses bonnes réponses ont été fournies et résolvent très bien le problème.
Si vous pouvez cependant modifier votre schéma, je vous conseillerais d'ajouter un champ dans votre customer
table qui contient id
le dernier customer_data
enregistrement de ce client:
CREATE TABLE customer (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
current_data_id INT UNSIGNED NULL DEFAULT NULL
);
CREATE TABLE customer_data (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
customer_id INT UNSIGNED NOT NULL,
title VARCHAR(10) NOT NULL,
forename VARCHAR(10) NOT NULL,
surname VARCHAR(10) NOT NULL
);
Interroger les clients
L'interrogation est aussi simple et rapide que possible:
SELECT c.*, d.title, d.forename, d.surname
FROM customer c
INNER JOIN customer_data d on d.id = c.current_data_id
WHERE ...;
L'inconvénient est la complexité supplémentaire lors de la création ou de la mise à jour d'un client.
Mettre à jour un client
Chaque fois que vous souhaitez mettre à jour un client, vous insérez un nouvel enregistrement dans la customer_data
table et mettez à jour l' customer
enregistrement.
INSERT INTO customer_data (customer_id, title, forename, surname) VALUES(2, 'Mr', 'John', 'Smith');
UPDATE customer SET current_data_id = LAST_INSERT_ID() WHERE id = 2;
Créer un client
Créer un client consiste simplement à insérer l' customer
entrée, puis à exécuter les mêmes instructions:
INSERT INTO customer () VALUES ();
SET @customer_id = LAST_INSERT_ID();
INSERT INTO customer_data (customer_id, title, forename, surname) VALUES(@customer_id, 'Mr', 'John', 'Smith');
UPDATE customer SET current_data_id = LAST_INSERT_ID() WHERE id = @customer_id;
Emballer
La complexité supplémentaire pour créer / mettre à jour un client peut être redoutable, mais elle peut facilement être automatisée avec des déclencheurs.
Enfin, si vous utilisez un ORM, cela peut être très facile à gérer. L'ORM peut se charger d'insérer les valeurs, de mettre à jour les identifiants et de joindre automatiquement les deux tables pour vous.
Voici à quoi Customer
ressemblerait votre modèle mutable :
class Customer
{
private int id;
private CustomerData currentData;
public Customer(String title, String forename, String surname)
{
this.update(title, forename, surname);
}
public void update(String title, String forename, String surname)
{
this.currentData = new CustomerData(this, title, forename, surname);
}
public String getTitle()
{
return this.currentData.getTitle();
}
public String getForename()
{
return this.currentData.getForename();
}
public String getSurname()
{
return this.currentData.getSurname();
}
}
Et votre CustomerData
modèle immuable , qui ne contient que des getters:
class CustomerData
{
private int id;
private Customer customer;
private String title;
private String forename;
private String surname;
public CustomerData(Customer customer, String title, String forename, String surname)
{
this.customer = customer;
this.title = title;
this.forename = forename;
this.surname = surname;
}
public String getTitle()
{
return this.title;
}
public String getForename()
{
return this.forename;
}
public String getSurname()
{
return this.surname;
}
}