आप इस तरह से निपटना चाहेंगे:
CREATE TABLE comments (
comment_id int,
body varchar(100),
PRIMARY KEY (comment_id)
);
CREATE TABLE users (
user_id int,
username varchar(20),
PRIMARY KEY (user_id)
);
CREATE TABLE comments_votes (
comment_id int,
user_id int,
vote_type int,
PRIMARY KEY (comment_id, user_id)
);
समग्र प्राथमिक कुंजी
(comment_id, user_id)
इंटरसेक्शन टेबल
पर comments_votes
उपयोगकर्ताओं को एक ही टिप्पणी पर कई बार मतदान करने से रोकेगा।
आइए ऊपर दिए गए स्कीमा में कुछ डेटा डालें:
INSERT INTO comments VALUES (1, 'first comment');
INSERT INTO comments VALUES (2, 'second comment');
INSERT INTO comments VALUES (3, 'third comment');
INSERT INTO users VALUES (1, 'user_a');
INSERT INTO users VALUES (2, 'user_b');
INSERT INTO users VALUES (3, 'user_c');
अब उपयोगकर्ता 1 के लिए कुछ वोट जोड़ें:
INSERT INTO comments_votes VALUES (1, 1, 1);
INSERT INTO comments_votes VALUES (2, 1, 1);
उपरोक्त का अर्थ है कि उपयोगकर्ता 1 ने टिप्पणी 1 और 2 पर टाइप 1 का वोट दिया।
यदि वही उपयोगकर्ता उन टिप्पणियों में से किसी एक पर फिर से वोट करने का प्रयास करता है, तो डेटाबेस उसे अस्वीकार कर देगा:
INSERT INTO comments_votes VALUES (1, 1, 1);
ERROR 1062 (23000): Duplicate entry '1-1' for key 'PRIMARY'
यदि आप InnoDB
का उपयोग कर रहे हैं भंडारण इंजन, विदेशी कुंजी
का उपयोग करना भी बुद्धिमानी होगी comment_id
. पर प्रतिबंध और user_id
चौराहे की मेज के क्षेत्र। हालांकि ध्यान दें कि MyISAM
, MySQL में डिफ़ॉल्ट स्टोरेज इंजन, विदेशी कुंजी बाधाओं को लागू नहीं करता है:
CREATE TABLE comments (
comment_id int,
body varchar(100),
PRIMARY KEY (comment_id)
) ENGINE=INNODB;
CREATE TABLE users (
user_id int,
username varchar(20),
PRIMARY KEY (user_id)
) ENGINE=INNODB;
CREATE TABLE comments_votes (
comment_id int,
user_id int,
vote_type int,
PRIMARY KEY (comment_id, user_id),
FOREIGN KEY (comment_id) REFERENCES comments (comment_id),
FOREIGN KEY (user_id) REFERENCES users (user_id)
) ENGINE=INNODB;
ये विदेशी कुंजियाँ गारंटी देती हैं कि comments_votes
. में एक पंक्ति कभी भी कोई comment_id
नहीं होगा या user_id
मान जो comments
. में मौजूद नहीं है और users
टेबल, क्रमशः। काम करने वाले रिलेशनल डेटाबेस के लिए विदेशी कुंजियों की आवश्यकता नहीं होती है, लेकिन टूटे हुए रिश्तों और अनाथ पंक्तियों से बचने के लिए वे निश्चित रूप से आवश्यक हैं (यानी। संदर्भात्मक अखंडता
)।
वास्तव में, रेफरेंशियल अखंडता एक ऐसी चीज है जिसे लागू करना बहुत मुश्किल होता यदि आप क्रमबद्ध सरणियों को एक एकल डेटाबेस फ़ील्ड में संग्रहीत करते।