Je sais que cette question est ancienne, mais elle a fait l'objet de 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 le schéma original de votre base de données, beaucoup de bonnes réponses ont été fournies et résolvent parfaitement le problème.
Si usted peut Cependant, si vous modifiez votre schéma, je vous conseille d'ajouter un champ dans votre customer
qui contient le id
de la dernière customer_data
pour 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.
Mise à jour d'un client
Lorsque vous souhaitez mettre à jour un client, vous insérez un nouvel enregistrement dans le fichier customer_data
et mettre à jour le tableau customer
enregistrer.
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éation d'un client
Pour créer un client, il suffit d'insérer l'élément customer
puis en exécutant les mêmes déclarations :
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;
Conclusion
La complexité supplémentaire liée à la création/mise à jour d'un client peut être redoutable, mais elle peut facilement être automatisée à l'aide de 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 les deux tables automatiquement pour vous.
Voici comment votre mutable Customer
ressemblerait à ce qui suit :
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 immuable CustomerData
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;
}
}