দুটি এনটিটির মধ্যে মেনি-টু-মেনি সম্পর্ক হলো এমন একটি সম্পর্ক যেখানে প্যারেন্ট এনটিটির প্রতিটি ইনস্ট্যান্স চাইল্ড এনটিটির শূন্য বা তার বেশি সংখ্যক ইনস্ট্যান্সের সাথে সম্পর্কিত থাকে এবং এর বিপরীতটিও সত্য।
মিউজিক স্ট্রিমিং অ্যাপের উদাহরণে, ব্যবহারকারী-নির্ধারিত প্লেলিস্টগুলোর গানগুলো বিবেচনা করুন। প্রতিটি প্লেলিস্টে অনেক গান থাকতে পারে, এবং প্রতিটি গান বিভিন্ন প্লেলিস্টের অংশ হতে পারে। সুতরাং, 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"])
data class PlaylistSongCrossRef(
val playlistId: Long,
val songId: Long
)
জাভা
@Entity
public class Playlist {
@PrimaryKey public long playlistId;
public String playlistName;
}
@Entity
public class Song {
@PrimaryKey public long songId;
public String songName;
public String artist;
}
@Entity(primaryKeys = {"playlistId", "songId"})
public class PlaylistSongCrossRef {
public long playlistId;
public long songId;
}
সত্তাগুলো সম্পর্কে জিজ্ঞাসা করুন
পরবর্তী পদক্ষেপটি নির্ভর করে আপনি এই সম্পর্কিত সত্তাগুলোকে কীভাবে কোয়েরি করতে চান তার উপর।
- যদি আপনি প্লেলিস্ট এবং প্রতিটি প্লেলিস্টের সংশ্লিষ্ট গানের তালিকা কোয়েরি করতে চান, তাহলে একটি নতুন ডেটা ক্লাস তৈরি করুন যাতে একটিমাত্র
Playlistঅবজেক্ট এবং সেই প্লেলিস্টে অন্তর্ভুক্ত সমস্তSongঅবজেক্টের একটি তালিকা থাকবে। - যদি আপনি গান এবং প্রতিটি গানের জন্য সংশ্লিষ্ট প্লেলিস্টের তালিকা কোয়েরি করতে চান, তাহলে একটি নতুন ডেটা ক্লাস তৈরি করুন যাতে একটিমাত্র
Songঅবজেক্ট এবং সেই সমস্তPlaylistঅবজেক্টের একটি তালিকা থাকবে, যেগুলিতে গানটি অন্তর্ভুক্ত।
উভয় ক্ষেত্রেই, Playlist ) এবং Song এনটিটির মধ্যে সম্পর্ক স্থাপনকারী ক্রস-রেফারেন্স এনটিটি শনাক্ত করতে, এই ক্লাসগুলোর প্রতিটির @Relation অ্যানোটেশনে associateBy প্রপার্টি ব্যবহার করে এনটিটিগুলোর মধ্যকার সম্পর্ক মডেল করুন।
কোটলিন
data class PlaylistWithSongs(
@Embedded val playlist: Playlist,
@Relation(
parentColumn = "playlistId",
entityColumn = "songId",
associateBy = Junction(PlaylistSongCrossRef::class)
)
val songs: List<Song>
)
data class SongWithPlaylists(
@Embedded val song: Song,
@Relation(
parentColumn = "songId",
entityColumn = "playlistId",
associateBy = Junction(PlaylistSongCrossRef::class)
)
val playlists: List<Playlist>
)
জাভা
public class PlaylistWithSongs {
@Embedded public Playlist playlist;
@Relation(
parentColumn = "playlistId",
entityColumn = "songId",
associateBy = @Junction(PlaylistSongCrossref.class)
)
public List<Song> songs;
}
public class SongWithPlaylists {
@Embedded public Song song;
@Relation(
parentColumn = "songId",
entityColumn = "playlistId",
associateBy = @Junction(PlaylistSongCrossref.class)
)
public List<Playlist> playlists;
}
অবশেষে, আপনার অ্যাপের প্রয়োজনীয় কোয়েরি ফাংশনটি প্রকাশ করার জন্য DAO ক্লাসে একটি মেথড যোগ করুন।
-
getPlaylistsWithSongs: এই মেথডটি ডাটাবেসে কোয়েরি করে এবং প্রাপ্ত সমস্তPlaylistWithSongsঅবজেক্ট রিটার্ন করে। -
getSongsWithPlaylists: এই মেথডটি ডাটাবেসে কোয়েরি করে এবং প্রাপ্ত সমস্তSongWithPlaylistsঅবজেক্ট রিটার্ন করে।
এই পদ্ধতিগুলোর প্রতিটিতে দুটি কোয়েরি চালানোর জন্য Room প্রয়োজন, তাই উভয় পদ্ধতিতেই @Transaction অ্যানোটেশনটি যোগ করুন যাতে সম্পূর্ণ অপারেশনটি অ্যাটমিকভাবে সম্পাদিত হয়।
কোটলিন
@Transaction
@Query("SELECT * FROM Playlist")
fun getPlaylistsWithSongs(): List<PlaylistWithSongs>
@Transaction
@Query("SELECT * FROM Song")
fun getSongsWithPlaylists(): List<SongWithPlaylists>
জাভা
@Transaction
@Query("SELECT * FROM Playlist")
public List<PlaylistWithSongs> getPlaylistsWithSongs();
@Transaction
@Query("SELECT * FROM Song")
public List<SongWithPlaylists> getSongsWithPlaylists();