/ / Postgresql कंप्यूटेड कॉलम - sql, postgresql, postgresql-9.4

Postgresql कंप्यूटेड कॉलम - sql, postgresql, postgresql-9.4

मेरा एक सवाल है, कि मुझे इसका जवाब नहीं मिला।

यहां एक उदाहरण दिया गया है:

तालिका: रुचियां

  • आईडी: पूर्णांक - प्राथमिक कुंजी
  • नाम: रुचि नाम - अद्वितीय
  • लोकप्रियता: रुचि लोकप्रियता

तालिका: उपयोगकर्ता

  • आईडी: पूर्णांक - प्राथमिक कुंजी
  • ईमेल: स्ट्रिंग - अद्वितीय
  • रुचियां: पूर्णांक की सरणी - "रुचियां" तालिका की विदेशी कुंजी

मैं चाहता हूं कि "रुचियों" तालिका का "लोकप्रियता" कॉलम "उपयोगकर्ता" तालिका के लिए धन्यवाद का गणना किया जाए।

तालिका उपयोगकर्ता

  id | email           | interests
0  | toto0.gmail.com | [ 0 ]
1  | toto1.gmail.com | [ 0, 1 ]
2  | toto2.gmail.com | [ 1 ]
3  | toto2.gmail.com | [ 2 ]

टेबल हितों

  id | name         | popularity
0  | "interest 0" | 2
1  | "interest 1" | 2
2  | "interest 2" | 1
3  | "interest 3" | 0

मैंने यह कोशिश की है:

  UPDATE interests SET popularity = (SELECT COUNT(*) from public.users where ARRAY[interests] @> ARRAY[interests.id]);

लेकिन मैं हितों की तालिका को अद्यतन करने के लिए एक क्वेरी नहीं चलाना चाहता। मेरा मतलब है, मैं चाहता हूं कि "लोकप्रियता" कॉलम स्वचालित रूप से भरा जाए जब कोई उपयोगकर्ता इसे सदस्यता लेता है।

अगर मैं इस तरह से "दृश्य" बनाता हूं, तो यह काम करना चाहिए जैसा मैं चाहता हूं?

  CREATE VIEW interests_popularity (id, popularity) AS
SELECT COUNT(1) as popularity, interest.id
FROM public.user, interest
WHERE ARRAY[public.user.interests] @> ARRAY[interest.id]
GROUP BY interest.id;

वहाँ ऐसा करने के लिए एक अधिक कुशल तरीका है?

उत्तर:

जवाब के लिए 0 № 1

कॉन्स्टेंटिन का सुझाव ट्रिगर का उपयोग करना था"रुचियां" तालिका में हर बार लोकप्रियता बढ़ने से उपयोगकर्ता किसी विशेष रुचि के लिए सदस्यता लेता है। यह पर्याप्त रूप से कुशल हो सकता है, जब तक कि कई सत्र एक विशेष ब्याज पर पंक्ति-स्तरीय लॉक पर प्रतीक्षा नहीं करते हैं जो कि कई सत्रों द्वारा अद्यतन किया जा रहा है।

यदि आप पर विशिष्टता बाधा गिरा दियातालिका "रुचियां", आप एक डालने के साथ मक्खी पर नए सब्सक्रिप्शन रिकॉर्ड कर सकते हैं जो कुछ भी नहीं रोकेंगे। समग्र आँकड़े लाने के लिए आपको करना होगा SELECT id, count(*) FROM interests GROUP BY id, जो आपके लिए काफी तेजी से हो सकता है यदि आप समय-समय पर डुप्लिकेट को खत्म करने के लिए इसे फिर से इकट्ठा करने के लिए पूरी मेज को अपडेट करते हैं।


जवाब के लिए 0 № 2

मैंने इस समस्या को संभालने के लिए अपना मॉडल बदल दिया है।

एक अलग तालिका है, और जब मुझे लोकप्रियता से एक ब्याज प्राप्त करने की आवश्यकता होती है तो मुझे बस एक "UNIQUE" कुंजी पर भरोसा करना होगा।