দুটি এনটিটির মধ্যে মেনি-টু-মেনি সম্পর্ক হলো এমন একটি সম্পর্ক যেখানে প্যারেন্ট এনটিটির প্রতিটি ইনস্ট্যান্স চাইল্ড এনটিটির শূন্য বা তার বেশি সংখ্যক ইনস্ট্যান্সের সাথে সম্পর্কিত থাকে এবং এর বিপরীতটিও সত্য।
মিউজিক স্ট্রিমিং অ্যাপের উদাহরণে, ব্যবহারকারী-নির্ধারিত প্লেলিস্টের গানগুলো বিবেচনা করুন। প্রতিটি প্লেলিস্টে অনেক গান থাকতে পারে এবং প্রতিটি গান একাধিক প্লেলিস্টের অন্তর্ভুক্ত হতে পারে। সুতরাং, Playlist এবং Song এনটিটিগুলোর মধ্যে একটি মেনি-টু-মেনি সম্পর্ক বিদ্যমান।
আপনার ডাটাবেসে মেনি-টু-মেনি সম্পর্ক সংজ্ঞায়িত করতে এবং কোয়েরি করতে এই ধাপগুলো অনুসরণ করুন:
- সম্পর্ক সংজ্ঞায়িত করুন : মেনি-টু-মেনি সম্পর্ক উপস্থাপনের জন্য এনটিটি এবং অ্যাসোসিয়েটিভ এনটিটি বা ক্রস-রেফারেন্স টেবিল স্থাপন করুন।
- সত্তাগুলো কোয়েরি করুন : আপনি কীভাবে সম্পর্কিত সত্তাগুলো কোয়েরি করতে চান তা নির্ধারণ করুন, এবং উদ্দিষ্ট আউটপুট উপস্থাপনের জন্য ডেটা ক্লাস তৈরি করুন।
সম্পর্কটি সংজ্ঞায়িত করুন
একটি মেনি-টু-মেনি সম্পর্ক সংজ্ঞায়িত করতে, প্রথমে আপনার দুটি এনটিটির প্রতিটির জন্য একটি করে ক্লাস তৈরি করুন। মেনি-টু-মেনি সম্পর্ক অন্যান্য সম্পর্কের ধরন থেকে আলাদা, কারণ এক্ষেত্রে সাধারণত চাইল্ড এনটিটিতে প্যারেন্ট এনটিটির কোনো রেফারেন্স থাকে না। এর পরিবর্তে, দুটি এনটিটির মধ্যে একটি অ্যাসোসিয়েটিভ এনটিটি বা ক্রস-রেফারেন্স টেবিল উপস্থাপন করার জন্য একটি তৃতীয় ক্লাস তৈরি করুন। ক্রস-রেফারেন্স টেবিলটিতে অবশ্যই মেনি-টু-মেনি সম্পর্কে থাকা প্রতিটি এনটিটির প্রাইমারি কী-এর জন্য কলাম থাকতে হবে। এই উদাহরণে, ক্রস-রেফারেন্স টেবিলের প্রতিটি সারি একটি Playlist ইনস্ট্যান্স এবং একটি Song ইনস্ট্যান্সের জোড়াকে নির্দেশ করে, যেখানে উল্লেখিত প্লেলিস্টটিতে উল্লেখিত গানটি অন্তর্ভুক্ত থাকে।
@Entity data class Playlist( @PrimaryKey val playlistId: Long, val playlistName: String ) @Entity data class Song( @PrimaryKey val songId: Long, val songName: String, val artist: String ) @Entity(primaryKeys = ["playlistId", "songId"], indices = [Index("playlistId", "songId")]) data class PlaylistSongCrossRef( val playlistId: Long, val songId: Long )
সত্তাগুলো সম্পর্কে জিজ্ঞাসা করুন
পরবর্তী পদক্ষেপটি নির্ভর করে আপনি এই সম্পর্কিত সত্তাগুলোকে কীভাবে কোয়েরি করতে চান তার উপর।
- যদি আপনি প্লেলিস্ট এবং প্রতিটি প্লেলিস্টের সংশ্লিষ্ট গানের তালিকা কোয়েরি করতে চান, তাহলে একটি নতুন ডেটা ক্লাস তৈরি করুন যাতে একটিমাত্র
Playlistঅবজেক্ট এবং প্লেলিস্টটিতে অন্তর্ভুক্তSongঅবজেক্টগুলোর একটি তালিকা থাকবে। - যদি আপনি গান এবং প্রতিটি গানের জন্য সংশ্লিষ্ট প্লেলিস্টের তালিকা কোয়েরি করতে চান, তাহলে একটি নতুন ডেটা ক্লাস তৈরি করুন যাতে একটিমাত্র
Songঅবজেক্ট এবং সেই গানটি অন্তর্ভুক্ত থাকাPlaylistঅবজেক্টগুলোর একটি তালিকা থাকবে।
উভয় ক্ষেত্রেই, Playlist ) এবং Song এনটিটির মধ্যে সম্পর্ক স্থাপনকারী ক্রস-রেফারেন্স এনটিটি শনাক্ত করতে, এই ক্লাসগুলোর প্রতিটির @Relation অ্যানোটেশনে associateBy প্রপার্টি ব্যবহার করে এনটিটিগুলোর মধ্যকার সম্পর্ক মডেল করুন।
data class PlaylistWithSongs( @Embedded val playlist: Playlist, @Relation( parentColumns = ["playlistId"], entityColumns = ["songId"], associateBy = Junction(PlaylistSongCrossRef::class) ) val songs: List<Song> ) data class SongWithPlaylists( @Embedded val song: Song, @Relation( parentColumns = ["songId"], entityColumns = ["playlistId"], associateBy = Junction(PlaylistSongCrossRef::class) ) val playlists: List<Playlist> )
অবশেষে, আপনার অ্যাপের প্রয়োজনীয় কোয়েরি ফাংশনটি প্রকাশ করার জন্য ডেটা অ্যাক্সেস অবজেক্ট (DAO) ক্লাসে একটি ফাংশন যোগ করুন।
-
getPlaylistsWithSongs - ডাটাবেস থেকে তথ্য সংগ্রহ করে প্রাপ্ত সমস্ত
PlaylistWithSongsঅবজেক্ট ফেরত দেয়। -
getSongsWithPlaylists - ডাটাবেস থেকে তথ্য সংগ্রহ করে প্রাপ্ত সমস্ত
SongWithPlaylistsঅবজেক্ট ফেরত দেয়।
প্রতিটি ফাংশনে দুটি কোয়েরি চালানোর জন্য জায়গা প্রয়োজন। অপারেশনটি যেন অ্যাটমিকভাবে চলে, তা নিশ্চিত করতে উভয় ফাংশনে @Transaction অ্যানোটেশনটি যোগ করুন।
@Transaction @Query("SELECT * FROM Playlist") suspend fun getPlaylistsWithSongs(): List<PlaylistWithSongs> @Transaction @Query("SELECT * FROM Song") suspend fun getSongsWithPlaylists(): List<SongWithPlaylists>
যৌগিক চাবি
যদি আপনি কম্পোজিট কী ব্যবহার করে সম্পর্কটি সংজ্ঞায়িত করেন, তাহলে @Relation অ্যানোটেশনের parentColumns এবং entityColumns এ একাধিক কলাম উল্লেখ করুন।
Junction কলাম নির্দিষ্ট করার প্রয়োজন হলে, Junction অ্যানোটেশনেও parentColumns এবং entityColumns ব্যবহার করুন।
নিম্নলিখিত উদাহরণে, Playlist একটি কম্পোজিট প্রাইমারি কী রয়েছে যা playlistId এবং creatorId নিয়ে গঠিত। ক্রস-রেফারেন্স টেবিল PlaylistSongCrossRef এও প্লেলিস্টটিকে রেফারেন্স করার জন্য এই কলামগুলো অন্তর্ভুক্ত রয়েছে।
@Entity(primaryKeys = ["playlistId", "creatorId"]) data class Playlist( val playlistId: Long, val creatorId: Long, val playlistName: String ) @Entity data class Song( @PrimaryKey val songId: Long, val songName: String, val artist: String ) @Entity(primaryKeys = ["playlistId", "creatorId", "songId"]) data class PlaylistSongCrossRef( val playlistId: Long, val creatorId: Long, val songId: Long ) data class PlaylistWithSongs( @Embedded val playlist: Playlist, @Relation( parentColumns = ["playlistId", "creatorId"], entityColumns = ["songId"], associateBy = Junction(PlaylistSongCrossRef::class) ) val songs: List<Song> )