मुझे पता है कि यह प्रश्न पुराना है, लेकिन यह वर्षों से बहुत अधिक ध्यान आकर्षित करता है और मुझे लगता है कि यह एक अवधारणा को याद कर रहा है जो किसी ऐसे ही मामले में किसी की मदद कर सकता है। मैं इसे यहाँ पूर्णता के लिए जोड़ रहा हूँ।
यदि आप अपने मूल डेटाबेस स्कीमा को संशोधित नहीं कर सकते हैं, तो बहुत सारे अच्छे उत्तर प्रदान किए गए हैं और समस्या का हल ठीक है।
यदि आप , हालांकि, अपने स्कीमा को संशोधित कर सकते हैं , तो मैं आपकी 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 का उपयोग कर रहे हैं, तो इसे प्रबंधित करना वास्तव में आसान हो सकता है। ओआरएम मूल्यों को सम्मिलित करने, आईडी अपडेट करने और आपके लिए स्वचालित रूप से दो तालिकाओं में शामिल होने का ध्यान रख सकता है।
यहां बताया गया है कि आपका परिवर्तनशील 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;
}
}