node.js - PostgreSQL / नोडजेएस के साथ परिणाम की सरणी के रूप में जुड़ें टेबल




(2)

मैं एक ऐसे ऐप का निर्माण कर रहा हूं जहां उपयोगकर्ता प्रश्न बनाने में सक्षम होते हैं, और अन्य लोग उन्हें ऊपर की तरफ बढ़ा सकते हैं / नीचे कर सकते हैं।

निम्नलिखित मेरे एसक्यूएल स्कीमा का एक हिस्सा है:

CREATE TABLE "questions" (
  id            SERIAL,
  content       VARCHAR(511) NOT NULL,
  created_at    TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT NOW(),
  CONSTRAINT    pk_question PRIMARY KEY (id)
);

CREATE TABLE "votes" (
  id            SERIAL,
  value         INT,
  question_id   INT NOT NULL,
  CONSTRAINT    pk_vote PRIMARY KEY (id),
  CONSTRAINT    fk_question_votes FOREIGN KEY (question_id) REFERENCES questions (id) MATCH SIMPLE ON UPDATE CASCADE ON DELETE CASCADE
);

मुझे क्या करना है, पोस्टग्रेज़ मुझे हर तरह से वोटों की एक सरणी के साथ देते हैं, जैसे:

[{ // a question
  id: 1,
  content: 'huh?',
  votes: [{ // a vote
    id: 1,
    value: 1
  }, { // another vote
    id: 2,
    value: -1
  }]
}, { /*another question with votes*/ }]

मैंने समेकित कार्य (जैसे array_agg ()) को देखा, लेकिन उसने मुझे केवल मान दिए। एक जॉइन ने मुझे एक प्रश्न के साथ एक प्रश्न शामिल किया, और मुझे सर्वर साइड ऑपरेशन करने के लिए मजबूर कर दिया, जिसे मैं नहीं पसंद करता।

क्या उसे करने का कोई तरीका है? क्या मैं गलत प्राप्त करना चाहता हूं इसके बारे में मेरी राय है?

आपके समय के लिए धन्यवाद।


Answers

यह पीजी-वादे के साथ करना आसान है:

function buildTree(t) {
    return t.map('SELECT * FROM questions', [], q => {
        return t.any('SELECT id, value FROM votes WHERE question_id = $1', q.id)
            .then(votes => {
                q.votes = votes;
                return q;
            });
    }).then(t.batch); // settles the array of promises generated
}

db.task(buildTree)
    .then(data => {
        console.log(data); // your data tree
    })
    .catch(error => {
        console.log(error);
    });

एपीआई: मानचित्र , किसी भी , कार्य , बैच

संबंधित सवाल:

और अगर आप सिर्फ एक ही क्वेरी का उपयोग करना चाहते हैं, तो PostgreSQL 9.4 और बाद में सिंटैक्स का उपयोग करके आप निम्न कार्य कर सकते हैं:

SELECT json_build_object('id', q.id, 'content', q.content, 'votes',
    (SELECT json_agg(json_build_object('id', v.id, 'value', v.value))
     FROM votes v WHERE q.id = v.question_id))
FROM questions q

और फिर आपका पीजी-वादा उदाहरण होगा:

var query =
    `SELECT json_build_object('id', q.id, 'content', q.content, 'votes',
        (SELECT json_agg(json_build_object('id', v.id, 'value', v.value))
         FROM votes v WHERE q.id = v.question_id)) json
    FROM questions q`;

db.map(query, [], a => a.json)
    .then(data => {
        console.log(data); // your data tree
    })
    .catch(error => {
        console.log(error);
    });

निष्कर्ष

ऊपर प्रस्तुत दो दृष्टिकोणों के बीच का विकल्प आपके आवेदन की प्रदर्शन आवश्यकताओं के आधार पर होना चाहिए:

  • सिंगल-क्वेरी दृष्टिकोण तेजी से होता है, लेकिन पर्याप्त रूप से वर्बोज़ होने के कारण पढ़ना या विस्तार करना कुछ मुश्किल होता है
  • बहु-क्वेरी दृष्टिकोण को समझना और विस्तार करना आसान है, लेकिन कार्यान्वित किए जाने वाले प्रश्नों की गतिशील संख्या के कारण यह प्रदर्शन के लिए अच्छा नहीं है।

पैमाने को स्थापित करके, आप परिशुद्धता को कम करते हैं। NUMBER (16,2) आज़माएं।





sql node.js postgresql