2010-07-28 13 views
5

ब्रेट टेलर के बारे में प्रश्न इस ब्लॉग पोस्ट में स्कीमा-डिजाइन पर चर्चा की: http://bret.appspot.com/entry/how-friendfeed-uses-mysqlFriendFeed के MySql स्कीमा-डिजाइन

ऐसा लगता है कि वे केवल एक ही table.Then में विभिन्न वर्ग के वस्तुओं संग्रहीत अधिक सूचकांक तालिका का निर्माण करें।

मेरा प्रश्न यह है कि एक वर्ग पर सूचकांक कैसे बनाया जाए।

उदाहरण के लिए, उपयोगकर्ता का ब्लॉग {id, userid, title, body} है। उपयोगकर्ता का ट्वीट {id, userid, tweet} है।

यदि मैं उपयोगकर्ताओं के ब्लॉग के लिए एक अनुक्रमणिका बनाना चाहता हूं तो मैं कैसे कर सकता हूं?

+0

आप चाहते हो सकता है [दस्तावेज़ डेटाबेस] को देखने के लिए (http://en.wikipedia.org/wiki/Document-oriented_database)। ये आपको पूरे दस्तावेज़ों को स्टोर करने की अनुमति देता है, जैसे कि FriendFeed करता है, लेकिन डेटाबेस आपके लिए सभी अनुक्रमणों का ख्याल रखता है। –

उत्तर

10

यह बहुत आसान है - शायद आप अपेक्षा से सरल है।

जब आप एक ब्लॉग इकाई स्टोर करते हैं, तो आप पाठ्यक्रम की मुख्य संस्था तालिका में सम्मिलित करने जा रहे हैं। एक ब्लॉग इस प्रकार है:

CREATE TABLE entities (
    id INT AUTO_INCREMENT PRIMARY KEY, 
    entity_json TEXT NOT NULL 
); 

INSERT INTO entities (id, entity_json) VALUES (DEFAULT, 
    '{userid: 8675309, 
     post_date: "2010-07-27", 
     title: "MySQL is NoSQL", 
     body: ... }' 
); 

तुम भी विशेषता में से प्रत्येक तार्किक प्रकार के लिए एक अलग सूचकांक तालिका में सम्मिलित करें। अपने उदाहरण का उपयोग करके, ब्लॉग के लिए उपयोगकर्ता आईडी एक ट्वीट के लिए उपयोगकर्ता आईडी के समान नहीं है। जब से तुम सिर्फ एक ब्लॉग डाला, तो आप ब्लॉग विशेषता (विशेषताओं) सूचकांक तालिका (रों) में दर्ज करें:

CREATE TABLE blog_userid (
    id INT NOT NULL PRIMARY KEY, 
    userid BIGINT UNSIGNED, 
    KEY (userid, id) 
); 

INSERT INTO blog_userid (id, userid) VALUES (LAST_INSERT_ID(), 8675309); 

CREATE TABLE blog_date (
    id INT NOT NULL PRIMARY KEY, 
    post_date DATETIME UNSIGNED, 
    KEY (post_date, id) 
); 

INSERT INTO blog_date (id, post_date) VALUES (LAST_INSERT_ID(), '2010-07-27'); 

किसी भी ट्वीट सूचकांक तालिका में न डालें, क्योंकि आप सिर्फ एक ब्लॉग, न ट्वीट बनाया ।

आप blog_userid संदर्भ ब्लॉग में सभी पंक्तियों को जानते हैं, क्योंकि इस तरह आपने उन्हें डाला है।

SELECT e.* 
FROM blog_userid u JOIN entities e ON u.id = e.id 
WHERE u.userid = 86765309; 

अपनी टिप्पणी पुन::

हाँ, आप वास्तविक कॉलम संस्थाओं मेज पर कोई गुण है कि आप सभी सामग्री पर लागू पता के लिए जोड़ सकते हैं ताकि आप उसे किसी उपयोगकर्ता के ब्लॉग के लिए खोज कर सकते हैं प्रकार के। उदाहरण के लिए:

CREATE TABLE entities (
    id INT AUTO_INCREMENT PRIMARY KEY, 
    entity_type INT NOT NULL, 
    creation_date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    entity_json TEXT NOT NULL 
); 

ENTITY_TYPE और CREATION_DATE आप कालानुक्रमिक क्रम में संस्थाओं क्रॉल (या उल्टे कालानुक्रम के) और सूचकांक टेबल के जो सेट में किसी पंक्ति का अस्तित्व प्रकार से मेल खाता है पता करने की अनुमति होगी के लिए कॉलम।

+0

लेकिन लेख में accroding। कभी-कभी वे एक नई अनुक्रमणिका बनाने या पुरानी अनुक्रमणिका को संशोधित करने के लिए इकाई तालिका को क्रॉल कर सकते हैं। मुझे लगता है कि ब्लॉब में एक नया कुंजी-वैल्यू "टाइप": "ब्लॉग" या "टाइप": "ट्वीट" जोड़ सकता है।क्या कोई बेहतर सुझाव है? – user404017

0

वे एक ही तालिका में विभिन्न वर्गों की वस्तुओं को स्टोर नहीं करते हैं। जिन 'संस्थाओं' का जिक्र है, उनका उपयोग केवल एक तरह की संस्थाओं को स्टोर करने के लिए किया जाता है।

उदाहरण के लिए, FriendFeed में एक विशिष्ट इकाई इस प्रकार दिखाई देंगे:

"id": "71f0c4d2291844cca2df6f486e96e37c", 
"user_id": "f48b0440ca0c4f66991c4d5f6a078eaf", 
"feed_id": "f48b0440ca0c4f66991c4d5f6a078eaf", 
"title": "We just launched a new backend system for FriendFeed!", 
"link": "http://friendfeed.com/e/71f0c4d2-2918-44cc-a2df-6f486e96e37c", 
"published": 1235697046, 
"updated": 1235697046, 

कार्यान्वयन बेहतर ढंग से समझने के लिए, उदाहरण पर एक नज़र यहाँ दे दिया है: https://github.com/jamesgolick/friendly#readme

+0

मेरा मानना ​​है कि वे वही करते हैं जो एक ही टेबल में विभिन्न प्रकार की वस्तुओं को स्टोर करते हैं)। यदि आप मूल पोस्ट से लिंक देखते हैं तो यह कहता है कि 'हमारी संस्थाएं एक टेबल में संग्रहीत होती हैं जो इस तरह दिखती है .... टेबल इकाइयां'। इकाई सामग्री जो आप उदाहरण देते हैं वह संस्था तालिका के शरीर के क्षेत्र में निहित है। मुझे लगता है कि डिजाइन का पूरा बिंदु है, क्या मुझे कुछ याद आ रही है? – riley

+0

हाँ आप कुछ याद कर रहे हैं। इसकी एक प्रकार की इकाई। वे स्कीमा-कम डिज़ाइन का उपयोग करते हैं ताकि वे तालिका को लॉक किए बिना कॉलम जोड़ और निकाल सकें। सभी इकाइयां एक इकाई के अपवाद के साथ समान होती हैं जो फ़ील्ड जोड़े जाने से पहले मौजूद थीं, उनके JSON में उस विशेष फ़ील्ड में नहीं है। –