2012-06-13 20 views
14

किसी डेटाबेस में "आदेशित सूचियों" को संग्रहीत करने का सबसे अच्छा तरीका क्या है, ताकि उन्हें अपडेट करना (प्रविष्टियों के क्रम को जोड़ना, निकालना और बदलना) आसानी से किया जा सके?किसी डेटाबेस में आदेशित सूचियों को संग्रहीत करने का सबसे अच्छा तरीका?

डेटाबेस पर विचार करें जहां आपके पास उपयोगकर्ताओं और फिल्मों के लिए एक टेबल है। प्रत्येक उपयोगकर्ता की पसंदीदा फिल्मों की एक सूची होती है।

चूंकि कई उपयोगकर्ता एक ही फिल्म को पसंद कर सकते हैं, इसलिए मैंने उपयोगकर्ताओं और फिल्मों को अलग-अलग टेबल बनाये और उन्हें जोड़ने के लिए तीसरी तालिका का उपयोग किया, usermovies।

usermovies में उपयोगकर्ता और एक मूवी और "ऑर्डर नंबर" की एक आईडी है। उपयोगकर्ताओं के लिए फिल्मों की सूची ऑर्डर करने के लिए ऑर्डर नंबर का उपयोग किया जाता है।

  1. प्रोमेथियस
  2. काले 3
  3. में
  4. पुरुषों तानाशाह

और उपयोगकर्ता जैक की तरह एक सूची हो सकता है::

उदाहरण के लिए, उपयोगकर्ता जोश निम्न सूची हो सकता है

  1. डिक्टेटर
  2. प्रोमेथियस
  3. युद्धपोत
  4. स्नो व्हाइट एंड द हंट्समैन

तो, वे कुछ पसंदीदा साझा करते हैं, लेकिन जरूरी नहीं कि एक ही क्रम में।

मैं एक क्वेरी का उपयोग कर प्रत्येक उपयोगकर्ता के लिए फिल्म ID की सूची प्राप्त कर सकते हैं: फिर

SELECT movie_id FROM usermovies WHERE user_id =? ORDER BY order_number 

, आदेश दिया movie_ids के साथ, मैं किसी अन्य क्वेरी

SELECT name FROM movies WHERE id in (?,?,?) ORDER BY FIELD (id, ?,?,?) 

का उपयोग करके फिल्मों की सूची प्राप्त कर सकते हैं तो सवाल पूछता है, लेकिन सूचियों को अपडेट करना वास्तव में जटिल लगता है - क्या इस जानकारी को स्टोर करने के बेहतर तरीके हैं ताकि उपयोगकर्ता एक्स के लिए फिल्मों की सूची प्राप्त करना आसान हो, फिल्में जोड़ें, उन्हें हटा दें और सूची का क्रम बदल दें?

+0

आप इस्तेमाल कर सकते हैं एक उपयोगकर्ता के लिए सभी फिल्मों प्राप्त करने के लिए ए इस तरह की एक क्वेरी: 'फिल्मों से चुनें नाम INERER usermovie.movie_id = movies.id और usermovie.user_id = पर usermovie में शामिल हों? Usermovie.order_number' द्वारा आदेश। और मुझे नहीं लगता कि वर्तमान दृष्टिकोण के साथ क्या मुश्किल है? किसी उपयोगकर्ता को मूवी जोड़ने के लिए आप बस अपने लिंकटेबल में एक नई प्रविष्टि डालते हैं और इसे हटाने के लिए आप एंट्री हटाते हैं। – Cyclonecode

+0

धन्यवाद! यह आसान होगा, हालांकि मेरी असली समस्या यहां अद्यतन है। – wannabeartist

उत्तर

5

फिल्मों और उपयोगकर्ताओं के बीच संबंध के गुणों के लिए अतिरिक्त कॉलम के साथ एक जंक्शन/लिंक तालिका एक एसोसिएशन कक्षा के साथ कई सारे संगठनों को साकार करने का मानक तरीका है - तो आपने जो किया है वह सही लगता है।

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

यह कहकर, आपको इन परिचालनों को एक लेनदेन में चलाने की भी आवश्यकता होगी और यदि आपके आवेदन में बहु-उपयोगकर्ता सक्षम है तो इस जंक्शन तालिका पर अधिक महत्वपूर्ण रूप से 'संस्करण' कॉलम होगा।

+0

के साथ डाली जाती हैं वास्तव में, * ऐसा होता है सभी पंक्तियों की बजाय केवल एक पंक्ति को बदलने के साथ कार्य करने के लिए "जादुई" तरीका: http://stackoverflow.com/a/3399334/2947812 –

3

उपयोगकर्ता पसंदीदा प्राप्त करने के लिए फिल्में आप एक ही क्वेरी इस्तेमाल कर सकते हैं:

SELECT um.order_number, m.name FROM movies m 
INNER JOIN usermovies um ON m.id = um.movie_id 
WHERE um.user_id = ? 
ORDER BY um.order_number 

जोड़ने/एक पसंदीदा फिल्म बस जोड़ें/usermovies तालिका में संबंधित रिकॉर्ड को दूर हटाने के लिए।
मूवी ऑर्डर बदलने के लिए उपयोगकर्ता से संबंधित user_movies तालिका में सभी order_number फ़ील्ड को बस बदलें।

+0

धन्यवाद, मुझे अभी भी यह सुनिश्चित नहीं है कि परिवर्तनों को कैसे संभाला जाए: उदाहरण के लिए, पहली फिल्म को हटाने से अन्य सभी फिल्मों के ऑर्डरर्नर्स को भी बदलना होगा, है ना? – wannabeartist

+0

@wannabeartist: हाँ, सुनिश्चित करें – Marco

+0

क्या व्यक्तिगत पंक्तियों को अपडेट करने के बजाय अपडेट पर सूची को फिर से बनाने का अर्थ होगा? उदाहरण के लिए, उपयोगकर्ता एक्स उसकी सूची लेता है, परिवर्तन करता है और हिट करता है "सेव करें" -> 1. पिछली प्रविष्टियां एक के साथ हटा दी जाती हैं 2. नई प्रविष्टियां एक साथ – wannabeartist

4

दूसरों के कहने के अलावा, मौजूदा पसंदीदाों को पुन: व्यवस्थित करना एक ही अद्यतन विवरण में किया जा सकता है, जैसा कि here समझाया गया है।

जुड़ा हुआ उत्तर दो वस्तुओं की पुनरावृत्ति को समझाता है, लेकिन किसी भी आइटम को आसानी से सामान्यीकृत किया जा सकता है।

एक विशिष्ट में नई पंक्तियाँ सम्मिलित करना:

3

आप एक "ऊपर ले जाएँ/नीचे ले जाने के" इस किस्म की समाधान की तलाश नहीं कर रहे हैं, और फिर सूची में सबसे नीचे जोड़ने के लिए दोषी है, यहाँ कुछ और संकेत दिए गए हैं स्थिति इस तरह किया जा सकता है:

UPDATE usermovies SET order_number = ordernumber + 1 
    WHERE ordernumber > 3 and user_id = ?; 
INSERT INTO usermovies VALUES (?, 3, ?); 

(स्थिति 3 में डालने) और इसी तरह से आप में नष्ट कर सकते हैं: (को हटाने स्थिति 6)

DELETE usermovies WHERE order_numer = 6 and user_id=?; 
UPDATE usermovies SET order_number = ordernumber - 1 
    WHERE ordernumber > 6 and user_id = ?; 
संबंधित मुद्दे

 संबंधित मुद्दे