私はこの質問が古いことを知っていますが、何年にもわたって多くの注目を集めており、同様のケースで誰かを助けることができる概念が欠けていると思います。完全を期すためにここに追加します。
元のデータベーススキーマを変更できない場合は、多くの適切な回答が提供されており、問題をうまく解決しています。
ただし、スキーマを変更できる場合は、この顧客の最新のレコードをcustomer
保持するフィールドをテーブルに追加することをお勧めします。id
customer_data
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
);
顧客への問い合わせ
クエリは、次のように簡単かつ高速です。
SELECT c.*, d.title, d.forename, d.surname
FROM customer c
INNER JOIN customer_data d on d.id = c.current_data_id
WHERE ...;
欠点は、顧客を作成または更新するときに複雑さが増すことです。
顧客の更新
顧客を更新するときはいつでも、customer_data
テーブルに新しいレコードを挿入して、customer
レコードを更新します。
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;
顧客の作成
顧客を作成するには、customer
エントリを挿入してから同じステートメントを実行するだけです。
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;
まとめ
顧客を作成/更新するための余分な複雑さは恐ろしいかもしれませんが、トリガーで簡単に自動化できます。
最後に、ORMを使用している場合、これは管理が非常に簡単です。ORMは、値の挿入、IDの更新、および2つのテーブルの結合を自動的に処理します。
変更可能なCustomer
モデルは次のようになります。
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();
}
}
そして、CustomerData
ゲッターのみを含む不変モデル:
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;
}
}