এক-থেকে-অনেক সম্পর্ককে সংজ্ঞায়িত করুন এবং জিজ্ঞাসা করুন, এক-থেকে-অনেক সম্পর্কের সংজ্ঞা দিন এবং অনুসন্ধান করুন

দুটি এনটিটির মধ্যে এক-থেকে-অনেক সম্পর্ক হলো এমন একটি সম্পর্ক যেখানে প্যারেন্ট এনটিটির প্রতিটি ইনস্ট্যান্স চাইল্ড এনটিটির শূন্য বা তার বেশি সংখ্যক ইনস্ট্যান্সের সাথে সম্পর্কিত থাকে, কিন্তু চাইল্ড এনটিটির প্রতিটি ইনস্ট্যান্স প্যারেন্ট এনটিটির ঠিক একটি মাত্র ইনস্ট্যান্সের সাথে সম্পর্কিত হতে পারে।

মিউজিক স্ট্রিমিং অ্যাপের উদাহরণে, ধরা যাক ব্যবহারকারী তার গানগুলোকে প্লেলিস্টে সাজাতে পারে। প্রত্যেক ব্যবহারকারী যত খুশি প্লেলিস্ট তৈরি করতে পারে, কিন্তু প্রতিটি প্লেলিস্ট ঠিক একজন ব্যবহারকারীই তৈরি করে। সুতরাং, User এনটিটি এবং Playlist এনটিটির মধ্যে একটি ওয়ান-টু-মেনি সম্পর্ক বিদ্যমান।

আপনার ডাটাবেসে ওয়ান-টু-মেনি রিলেশনশিপ সংজ্ঞায়িত করতে এবং কোয়েরি করতে এই ধাপগুলো অনুসরণ করুন:

  1. সম্পর্কটি সংজ্ঞায়িত করুন : উভয় এনটিটির জন্য ক্লাস তৈরি করুন, যেখানে চাইল্ড এনটিটিটিটি প্যারেন্টের প্রাইমারি কী-কে রেফারেন্স করবে।
  2. এনটিটিগুলো কোয়েরি করুন : একটি নতুন ডেটা ক্লাসে সম্পর্কটি মডেল করুন এবং সম্পর্কিত ডেটা পুনরুদ্ধার করার জন্য একটি ফাংশন ইমপ্লিমেন্ট করুন।

সম্পর্কটি সংজ্ঞায়িত করুন

এক-থেকে-অনেক সম্পর্ক (one-to-many relationship) সংজ্ঞায়িত করতে, প্রথমে প্রতিটি এনটিটির জন্য একটি ক্লাস তৈরি করুন। এক-থেকে-এক সম্পর্কের (one-to-one relationship) মতোই, চাইল্ড এনটিটিতে অবশ্যই একটি ভেরিয়েবল অন্তর্ভুক্ত থাকতে হবে যা প্যারেন্ট এনটিটির প্রাইমারি কী-কে রেফারেন্স করে।

@Entity
data class User(
    @PrimaryKey val userId: Long,
    val name: String,
    val age: Int
)

@Entity
data class Playlist(
    @PrimaryKey val playlistId: Long,
    val userCreatorId: Long,
    val playlistName: String
)

সত্তাগুলো সম্পর্কে জিজ্ঞাসা করুন

ব্যবহারকারী এবং সংশ্লিষ্ট প্লেলিস্টের তালিকা কোয়েরি করতে হলে, আপনাকে প্রথমে এই দুটি সত্তার মধ্যে এক-থেকে-অনেক সম্পর্কটি মডেল করতে হবে।

সম্পর্কটি মডেল করার জন্য, একটি নতুন ডেটা ক্লাস তৈরি করুন। এই ক্লাসের প্রতিটি ইনস্ট্যান্সে প্যারেন্ট এনটিটির একটি ইনস্ট্যান্স এবং এর সাথে সম্পর্কিত সমস্ত চাইল্ড এনটিটি ইনস্ট্যান্সের একটি তালিকা থাকবে। চাইল্ড এনটিটিগুলোর তালিকা নির্দেশকারী প্রপার্টিতে @Relation অ্যানোটেশনটি যোগ করুন। parentColumns প্যারেন্ট এনটিটির প্রাইমারি কী কলামের নামে এবং entityColumns চাইল্ড এনটিটির সেই কলামের নামে সেট করুন, যেটি প্যারেন্ট এনটিটির প্রাইমারি কী-কে রেফারেন্স করে।

data class UserWithPlaylists(
    @Embedded val user: User,
    @Relation(
        parentColumns = ["userId"],
        entityColumns = ["userCreatorId"]
    )
    val playlists: List<Playlist>
)

অবশেষে, ডেটা অ্যাক্সেস অবজেক্ট (DAO) ক্লাসে একটি ফাংশন যোগ করুন যা প্যারেন্ট এনটিটি এবং চাইল্ড এনটিটির সাথে যুক্ত ডেটা ক্লাসের সমস্ত ইনস্ট্যান্স রিটার্ন করে। @Transaction অ্যানোটেশনটি যোগ করুন যাতে Room সম্পূর্ণ অপারেশনটি অ্যাটমিকভাবে সম্পাদন করে। এই অ্যানোটেশনটি প্রয়োজনীয় কারণ ফাংশনটির জন্য Room-কে দুটি কোয়েরি চালাতে হয়।

@Transaction
@Query("SELECT * FROM User")
suspend fun getUsersWithPlaylists(): List<UserWithPlaylists>

যৌগিক চাবি

যদি আপনি কম্পোজিট কী ব্যবহার করে সম্পর্কটি নির্ধারণ করেন, তাহলে parentColumns এবং entityColumns এ একাধিক কলাম উল্লেখ করুন। parentColumns এর কলামগুলোর ক্রম অবশ্যই entityColumns এর কলামগুলোর ক্রমের সাথে মিলতে হবে।

@Entity(primaryKeys = ["firstName", "lastName"])
data class User(
    val firstName: String,
    val lastName: String,
    val age: Int
)

@Entity
data class Playlist(
    @PrimaryKey val playlistId: Long,
    val userFirstName: String,
    val userLastName: String,
    val playlistName: String
)

data class UserWithPlaylists(
    @Embedded val user: User,
    @Relation(
        parentColumns = ["firstName", "lastName"],
        entityColumns = ["userFirstName", "userLastName"]
    )
    val playlists: List<Playlist>
)