विज्ञापन 1 और 2:आपका डेटा मॉडल ठीक है। यहां विदेशी कुंजियों का उपयोग करना महत्वपूर्ण है। एक और बात जो आपको ध्यान रखने की आवश्यकता है वह यह है कि डेटाबेस को यह सुनिश्चित करना चाहिए कि प्रत्येक पोस्ट के लिए एक टॉपिक रिकॉर्ड है। यह POST.topic_id NOT NULL . को सेट करके किया जाता है विशेषता। यह DB पक्ष पर पर्याप्त सुरक्षा तंत्र है, क्योंकि यह सुनिश्चित करता है कि कोई भी POST TOPIC के बिना नहीं छोड़ा जाएगा। कोई फर्क नहीं पड़ता कि आप अपने POST के साथ अब क्या करते हैं आप एक TOPIC प्रदान करने के लिए बाध्य हैं।
विज्ञापन 3:संग्रहीत कार्यविधि वाले ट्रिगर की यहां अनुशंसा नहीं की जाती है क्योंकि आपकी TOPIC तालिका (IsSticky, IsLocked, आदि) में अतिरिक्त डेटा है, जिसे आप TOPIC रिकॉर्ड निर्माण पर प्रदान करना चाहते हैं। साथ ही, यदि ऐसा कोई ट्रिगर लागू होगा, तो डेटाबेस डिज़ाइन अपसामान्यीकरण का विषय होगा।
विज्ञापन 4:व्यावसायिक तर्क पक्ष पर अब आप बिना किसी निर्दिष्ट topic_id के हर बार एक नया POST रिकॉर्ड बनाए जाने पर TOPIC रिकॉर्ड बनाने के लिए एक स्वचालित तंत्र लिखकर अपनी सहायता कर सकते हैं। मैं इसके लिए कुछ ओआरएम का उपयोग करने की सलाह देता हूं या किसी भी एमवीसी ढांचे में उपलब्ध डेटा मॉडल का लाभ उठाता हूं। ऐसे मॉडलों का खाका कुछ इस तरह दिखेगा:
abstract class AModel // this class should be provided by ORM or framework
{
/**
* @var PDO
*/
protected $_db_driver;
public function getLastInsertId()
{
$stmt = $this->_db_driver->prepare('SELECT LAST_INSERT_ID() AS id');
$stmt->execute();
return $stmt->fetch(PDO::FETCH_OBJ)->id;
}
public abstract function getFieldList();
}
class ForumTopicModel extends AModel
{
public function insert(array $data)
{
$sql = 'INSERT INTO topic VALUES (:id, :forum_id, :person_id, :is_locked, ...)';
$stmt = $this->_db_driver->prepare($sql);
return $stmt->execute($data);
}
public function getFieldList()
{
return array('id', 'forum_id', 'person_id', 'is_locked', /*...*/);
}
// ...
}
class ForumPostModel extends AModel
{
public function insert(array $data)
{
$sql = 'INSERT INTO post VALUES (:id, :topic_id, :person_id, :subject, ...)';
$stmt = $this->_db_driver->prepare($sql);
return $stmt->execute($data);
}
public function getFieldList()
{
return array('id', 'topic_id', 'person_id', 'subject', /*...*/);
}
public function insertInitialTopicPost(array $form_data)
{
$this->_db_driver->beginTransaction();
$result = true;
if ( empty($form_data['topic_id']) ) {
// no topic_id provided, so create new one:
$topic = new ForumTopicModel();
$topic_data = array_intersect_key(
$form_data, array_flip($topic->getFieldList())
);
$result = $topic->insert($topic_data);
$form_data['topic_id'] = $topic->getLastInsertId();
}
if ( $result ) {
$forum_post_data = array_intersect_key(
$form_data, array_flip($this->getFieldList())
);
$result = $this->insert($forum_post_data);
}
if ( $result ) {
$this->_db_driver->commit();
}
else {
$this->_db_driver->rollBack();
}
return $result;
}
// ...
}
नोट:एक अच्छा एमवीसी अभ्यास के रूप में उन मॉडलों को टेबल पंक्तियों पर सीधे संचालित करने का एकमात्र स्थान होना चाहिए। अन्यथा आपको SQL त्रुटियाँ मिल जाएँगी (लेकिन डेटा मॉडल सुसंगत रहेगा, इसलिए आपको चिंता करने की ज़रूरत नहीं है कि कुछ टूट जाएगा)।
अंत में नियंत्रक . में अपने मॉडल का लाभ उठाएं परत:
class ForumPostController extends AController
{
public function createInitialTopicPostAction()
{
$form_data = $this->getRequest()->getPost(); /* wrapper for getting
the $_POST array */
// (...) validate and filter $form_data here
$forumPost = new ForumPostModel();
$result = $forumPost->insertInitialTopicPost($form_data);
if ( $result ) {
// display success message
}
else {
// display failure message
}
}
}