Ich weiß, dass diese Frage alt ist, aber sie hat im Laufe der Jahre viel Aufmerksamkeit erhalten, und ich denke, es fehlt ein Konzept, das jemandem in einem ähnlichen Fall helfen könnte. Der Vollständigkeit halber füge ich es hier hinzu.
Wenn Sie Ihr ursprüngliches Datenbankschema nicht ändern können, wurden viele gute Antworten gegeben, um das Problem einwandfrei zu lösen.
Wenn Sie können jedoch Ihr Schema ändern, würde ich raten , ein Feld in Ihrem hinzuzufügen customer
Tabelle , die das hält id
der neuesten customer_data
Rekord für diesen Kunden:
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
);
Kunden abfragen
Das Abfragen ist so einfach und schnell wie möglich:
SELECT c.*, d.title, d.forename, d.surname
FROM customer c
INNER JOIN customer_data d on d.id = c.current_data_id
WHERE ...;
Der Nachteil ist die zusätzliche Komplexität beim Erstellen oder Aktualisieren eines Kunden.
Kunden aktualisieren
Wenn Sie einen Kunden aktualisieren möchten, fügen Sie einen neuen Datensatz in die customer_data
Tabelle ein und aktualisieren den customer
Datensatz.
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;
Kunden erstellen
Beim Erstellen eines Kunden müssen Sie lediglich den customer
Eintrag einfügen und dann dieselben Anweisungen ausführen:
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;
Einpacken
Die zusätzliche Komplexität beim Erstellen / Aktualisieren eines Kunden mag furchterregend sein, kann jedoch leicht mit Triggern automatisiert werden.
Wenn Sie ein ORM verwenden, kann dies sehr einfach zu verwalten sein. Das ORM kann sich darum kümmern, die Werte einzufügen, die IDs zu aktualisieren und die beiden Tabellen automatisch für Sie zu verbinden.
So Customer
würde Ihr veränderliches Modell aussehen:
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();
}
}
Und Ihr unveränderliches CustomerData
Modell, das nur Getter enthält:
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;
}
}