এস্কেলিটোর সাথে তালিকা-প্রকার পরিচালনা করা


144

আমার কাছে ডেটা প্রকারের সংজ্ঞা দেওয়া আছে:

data ComitteeView = CommitteeView { committeeId :: CommitteeId
                                  , committeeMembers :: [Person] 
                                  }

data CommitteesView = CommitteesView { committeeView :: [CommitteeView] }

এখন, এটি যেমন দাঁড়িয়েছে, আমার কাছে একটি পার্সেন্টিভ মডেল সংজ্ঞায়িত হয়েছে:

Person
  name  Text

Committee
  name  Text

CommitteePerson
  personId    PersonId
  committeeId CommitteeId

এস্কেলিটো ব্যবহার করে আমি খুব সহজেই একটি কমিটিভিউ পপুলেশন করতে একটি ক্যোরি তৈরি করতে পারি। এটি এমন কিছু হবে:

getCommitteeView cid = 
  CommitteeView <$> runDB $ 
    select $
      from (person `InnerJoin` pxc `InnerJoin` committee) -> do
        on  (committee ^. CommitteeId ==. pxc ^. CommitteePersonCommitteeId)
        on  (person ^. PersonId       ==. pxc ^. CommitteePersonPersonId)
        where_ (committee ^. CommitteePersonCommitteeId ==. val cid)
        return person

এখন, জনবহুলের সমস্যা বিবেচনা করুন CommitteesView। নীতিগতভাবে, আমরা উপরের ক্যোয়ারিতে সাবকোয়ারি চালিয়ে জনসংখ্যার জন্য পর্যাপ্ত পরিমাণে ডেটা পাই। ঠিক আছে, যথেষ্ট ন্যায্য। এখন আমি কীভাবে group byএসকিউএল এর মতো "গ্রুপ অনুসারে হাসেল-তালিকা" ব্যবহার করতে পারি ? আমি কীভাবে সারিগুলিকে ভাঁজ করতে পারি যাতে আমি মানুষের তালিকার একটি তালিকা শেষ করতে পারি?

আমি এমন ধারণা পেয়েছি যা কেসটি esqueletoহ্যান্ডেল করতে পারে না (যেমন, এটিতে কোনও সংযুক্তকারী নেই যা এটি করবে)। এবং আমার অন্তর্নিহিত ডাটাবেস স্পষ্টতই কলাম হিসাবে হাস্কেল তালিকাগুলি সমর্থন করে না। তবে, অবশ্যই, আমি এই সমস্যার মুখোমুখি একমাত্র ব্যক্তি হতে পারি না। কার্যকর কৌশল কী? তালিকাদের একটি এন-তালিকা ভাঁজ করে একটি এন-তালিকায়? বা n+1জিজ্ঞাসা চলমান ? অন্য কোন বিকল্প আছে?


2
আপনি কি তাকিয়েছেন Data.List.groupBy?
সিডিকে

@ সিডিকে: হ্যাঁ, আমি যাচ্ছিলাম। এটি আশ্চর্যজনক লোমশ হয়, যদিও।
নাম

উত্তর:


2

এস্কেলিটো বলতে বোঝায় না যে বাক্সের বাইরে সাবলিস্টগুলির তালিকা (বহুমাত্রিক তালিকা) হ্যান্ডেল করা! Data.List.groupByসেই 'সিডিকে' আপনাকে পরামর্শ দিয়েছে কেবলমাত্র নিজেরাই তালিকাবদ্ধ করতে পারে তবে আপনি যা চেয়েছিলেন তা নয়।

আপনার ক্ষেত্রে আমি দৃistent়ভাবে আপনাকে একটি ক্লাসিক এসকিউএল কোয়েরি ব্যবহার করার পরামর্শ দেব। আপনি এন + ১ টি ক্যুরিয়াস চালাতে পারেন, তবে এটি কেবল তখনই করুন যখন এটি বিরল এবং প্রায়শই ব্যবহারযোগ্য ফাংশন না হয়, উদাহরণস্বরূপ ক্যাশেড ডেটা প্রস্তুত করে (আপনার ভেরিয়েবলের নামের উপর ভিত্তি করে আমি মনে করি এটি ভারী ব্যবহৃত হতে পারে না এবং এটি চেষ্টা করে দেখার মতো)। ভারী ব্যবহারের জন্য আপনার কোনও সন্দেহ ছাড়াই ক্লাসিক এসকিউএল ব্যবহার করা উচিত।

আপনি যদি https://github.com/prowdsponsor/esqueleto এ যান তবে আপনি এটি দেখতে পাবেন:

সমস্ত এসকিউএল বৈশিষ্ট্য উপলব্ধ নয়, তবে তাদের বেশিরভাগ সহজেই যুক্ত করা যেতে পারে (বিশেষত ফাংশন)।

যাতে আপনি একটি নতুন বৈশিষ্ট্য জিজ্ঞাসা করতে চেষ্টা করতে পারেন। শুভকামনা!


আপনার কি এই সূত্রের কোনও লিঙ্ক আছে? কেউ যদি সঠিক উত্তরটি যাচাই করতে পারে বা আপনি কোনও প্রকারের ডকুমেন্টেশন সরবরাহ করতে পারেন তবে আমি এই অনুগ্রহটি পুরষ্কারে খুশি হব।
টেক সাওয়ান্ত

@ কুখ্যাতপেট0 আপনি যদি হ্যাশেল ওয়েবসাইটে যান তবে আপনি উদাহরণের সম্পূর্ণ তালিকা পাবেন এবং কেসগুলি ব্যবহার করবেন এবং এর মধ্যে কোনওগুলি বহুমাত্রিক তালিকা এমনকি "অভ্যন্তরীণ যোগদান" ব্যবহার করে না। আপনি যদি সেখানে "গোষ্ঠী দ্বারা" সন্ধান করেন, আপনি দেখতে পাবেন এটি একটি টিপলে একাধিক কলামগুলি আবদ্ধ করার জন্য বা অতিরিক্ত সামগ্রিক ফাংশন দ্বারা বাছাইয়ের জন্য ব্যবহার করা যেতে পারে। এটি সেখানেও বলা হয়েছে যে বিকাশকারীরা যে কোনও জিজ্ঞাসাকে সমর্থন করার জন্য এস্কেলিটোকে ততটাই নমনীয় করে তোলার চেষ্টা করেন, তাই আপনি এখানে অতিরিক্ত বর্ধনের জন্য বলতে পারেন ।
কাইনাक्स
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.