দুটি সত্তার মধ্যে বহু-থেকে-অনেক সম্পর্ক হল এমন একটি সম্পর্ক যেখানে মূল সত্তার প্রতিটি দৃষ্টান্ত শিশু সত্তার শূন্য বা তার বেশি দৃষ্টান্তের সাথে মিলে যায় এবং বিপরীতটিও সত্য।
মিউজিক স্ট্রিমিং অ্যাপের উদাহরণে, ব্যবহারকারী-সংজ্ঞায়িত প্লেলিস্টের গানগুলি বিবেচনা করুন। প্রতিটি প্লেলিস্ট অনেক গান অন্তর্ভুক্ত করতে পারে, এবং প্রতিটি গান বিভিন্ন প্লেলিস্টের একটি অংশ হতে পারে। অতএব, 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
অবজেক্টগুলিকে রিটার্ন করে।
এই পদ্ধতিগুলির প্রতিটিতে দুটি প্রশ্ন চালানোর জন্য রুম প্রয়োজন, তাই উভয় পদ্ধতিতে @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();