আমার কাছে ডেটা প্রকারের সংজ্ঞা দেওয়া আছে:
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
জিজ্ঞাসা চলমান ? অন্য কোন বিকল্প আছে?
Data.List.groupBy
?