বস্তুর মধ্যে সম্পর্কের ধরন নির্বাচন করুন

যেহেতু SQLite একটি রিলেশনাল ডেটাবেস, তাই আপনি এনটিটিগুলোর মধ্যে সম্পর্ক স্থাপন করতে পারেন। কিন্তু বেশিরভাগ অবজেক্ট-রিলেশনাল ম্যাপিং লাইব্রেরি যেখানে এনটিটি অবজেক্টগুলোকে একে অপরকে রেফারেন্স করতে দেয়, সেখানে Room স্পষ্টভাবে এটি নিষিদ্ধ করে। এই সিদ্ধান্তের পেছনের প্রযুক্তিগত কারণ সম্পর্কে জানতে, "Understand why Room doesn't allow object references " দেখুন।

সম্পর্কের প্রকারভেদ

রুম নিম্নলিখিত সম্পর্ক প্রকারগুলি সমর্থন করে:

  • এক-এক : এমন একটি সম্পর্ককে বোঝায় যেখানে একটি সত্তা অন্য একটি সত্তার সাথে সম্পর্কিত থাকে।
  • এক-থেকে-অনেক : এমন একটি সম্পর্ককে বোঝায় যেখানে একটি একক সত্তা অন্য ধরনের একাধিক সত্তার সাথে সম্পর্কিত হতে পারে।
  • মেনি-টু-মেনি : এমন একটি সম্পর্ককে বোঝায় যেখানে এক ধরনের একাধিক এনটিটি অন্য ধরনের একাধিক এনটিটির সাথে সম্পর্কিত হতে পারে। এর জন্য সাধারণত একটি জাংশন টেবিলের প্রয়োজন হয়।
  • নেস্টেড রিলেশনশিপ (এমবেডেড অবজেক্ট ব্যবহার করে) : এমন একটি সম্পর্ককে বোঝায় যেখানে একটি এনটিটি অন্য একটি এনটিটিকে ফিল্ড হিসেবে ধারণ করে, এবং এই নেস্টেড এনটিটিটি আরও অন্যান্য এনটিটিকে ধারণ করতে পারে। এর জন্য @Embedded অ্যানোটেশনটি ব্যবহৃত হয়।

দুটি পদ্ধতির মধ্যে একটি বেছে নিন

Room-এ, এনটিটিগুলোর মধ্যে সম্পর্ক সংজ্ঞায়িত এবং কোয়েরি করার দুটি উপায় রয়েছে:

  • এমবেডেড অবজেক্ট সহ একটি মধ্যবর্তী ডেটা ক্লাস, অথবা
  • একটি রিলেশনাল কোয়েরি মেথড যার রিটার্ন টাইপ হলো মাল্টিম্যাপ।

মধ্যবর্তী ডেটা ক্লাস ব্যবহার করার কোনো নির্দিষ্ট কারণ না থাকলে, আমরা মাল্টিম্যাপ রিটার্ন টাইপ পদ্ধতিটি ব্যবহার করার পরামর্শ দিই। এই পদ্ধতি সম্পর্কে আরও জানতে, “Return a multimap” দেখুন।

ইন্টারমিডিয়েট ডেটা ক্লাস পদ্ধতি আপনাকে জটিল SQL কোয়েরি লেখা এড়াতে সাহায্য করে, কিন্তু এর ফলে কোডের জটিলতাও বেড়ে যেতে পারে, কারণ এর জন্য অতিরিক্ত ডেটা ক্লাসের প্রয়োজন হয়। সংক্ষেপে, মাল্টিম্যাপ রিটার্ন টাইপ পদ্ধতিতে আপনার SQL কোয়েরিগুলোকে বেশি কাজ করতে হয়, এবং ইন্টারমিডিয়েট ডেটা ক্লাস পদ্ধতিতে আপনার কোডকেও বেশি কাজ করতে হয়।

মধ্যবর্তী ডেটা ক্লাস পদ্ধতি ব্যবহার করুন

ইন্টারমিডিয়েট ডেটা ক্লাস পদ্ধতিতে, আপনি এমন একটি ডেটা ক্লাস সংজ্ঞায়িত করেন যা আপনার Room এনটিটিগুলোর মধ্যকার সম্পর্ককে মডেল করে। এই ডেটা ক্লাসটি একটি এনটিটির ইনস্ট্যান্সের সাথে অন্য একটি এনটিটির ইনস্ট্যান্সের জোড়গুলোকে এমবেডেড অবজেক্ট হিসেবে ধারণ করে। এরপর আপনার কোয়েরি মেথডগুলো আপনার অ্যাপে ব্যবহারের জন্য এই ডেটা ক্লাসের ইনস্ট্যান্সগুলো রিটার্ন করতে পারে।

উদাহরণস্বরূপ, আপনি নির্দিষ্ট বই ধার নেওয়া লাইব্রেরি ব্যবহারকারীদের প্রতিনিধিত্ব করার জন্য একটি UserBook ডেটা ক্লাস সংজ্ঞায়িত করতে পারেন, এবং ডাটাবেস থেকে UserBook ইনস্ট্যান্সগুলির একটি তালিকা পুনরুদ্ধার করার জন্য একটি কোয়েরি মেথড সংজ্ঞায়িত করতে পারেন:

কোটলিন

@Dao
interface UserBookDao {
    @Query(
        "SELECT user.name AS userName, book.name AS bookName " +
        "FROM user, book " +
        "WHERE user.id = book.user_id"
    )
    fun loadUserAndBookNames(): LiveData<List<UserBook>>
}

data class UserBook(val userName: String?, val bookName: String?)

জাভা

@Dao
public interface UserBookDao {
   @Query("SELECT user.name AS userName, book.name AS bookName " +
          "FROM user, book " +
          "WHERE user.id = book.user_id")
   public LiveData<List<UserBook>> loadUserAndBookNames();
}

public class UserBook {
    public String userName;
    public String bookName;
}

মাল্টিম্যাপ রিটার্ন টাইপ পদ্ধতি ব্যবহার করুন

মাল্টিম্যাপ রিটার্ন টাইপ পদ্ধতিতে, আপনাকে কোনো অতিরিক্ত ডেটা ক্লাস সংজ্ঞায়িত করতে হয় না। এর পরিবর্তে, আপনি আপনার কাঙ্ক্ষিত ম্যাপ কাঠামোর উপর ভিত্তি করে আপনার মেথডের জন্য একটি মাল্টিম্যাপ রিটার্ন টাইপ সংজ্ঞায়িত করেন এবং আপনার SQL কোয়েরিতে সরাসরি এনটিটিগুলোর মধ্যে সম্পর্ক নির্ধারণ করেন।

উদাহরণস্বরূপ, নিম্নলিখিত কোয়েরি মেথডটি User এবং Book ইনস্ট্যান্সের একটি ম্যাপিং রিটার্ন করে, যা নির্দিষ্ট বই চেক আউট করা লাইব্রেরি ব্যবহারকারীদের প্রতিনিধিত্ব করে:

কোটলিন

@Query(
    "SELECT * FROM user" +
    "JOIN book ON user.id = book.user_id"
)
fun loadUserAndBookNames(): Map<User, List<Book>>

জাভা

@Query(
    "SELECT * FROM user" +
    "JOIN book ON user.id = book.user_id"
)
public Map<User, List<Book>> loadUserAndBookNames();

এমবেডেড অবজেক্ট তৈরি করুন

কখনও কখনও, আপনি আপনার ডাটাবেস লজিকে একটি সত্তা বা ডেটা অবজেক্টকে একটি সুসংহত সত্তা হিসেবে প্রকাশ করতে চাইতে পারেন, এমনকি যদি সেই অবজেক্টটিতে একাধিক ফিল্ড থাকে। এই পরিস্থিতিতে, আপনি @Embedded অ্যানোটেশনটি ব্যবহার করে এমন একটি অবজেক্টকে উপস্থাপন করতে পারেন, যাকে আপনি একটি টেবিলের মধ্যে তার সাবফিল্ডগুলিতে বিভক্ত করতে চান। এরপর আপনি অন্যান্য স্বতন্ত্র কলামের মতোই এমবেডেড ফিল্ডগুলো কোয়েরি করতে পারবেন।

উদাহরণস্বরূপ, আপনার User ক্লাসে Address টাইপের একটি ফিল্ড থাকতে পারে যা street , city , state , এবং postCode নামের ফিল্ডগুলোর একটি সংমিশ্রণকে উপস্থাপন করে। এই সংমিশ্রিত কলামগুলোকে টেবিলে আলাদাভাবে সংরক্ষণ করার জন্য, একটি Address ফিল্ড অন্তর্ভুক্ত করুন। এটি User ক্লাসে @Embedded অ্যানোটেশন সহ প্রদর্শিত হওয়া উচিত। নিম্নলিখিত কোড স্নিপেটটি এটি প্রদর্শন করে:

কোটলিন

data class Address(
    val street: String?,
    val state: String?,
    val city: String?,
    @ColumnInfo(name = "post_code") val postCode: Int
)

@Entity
data class User(
    @PrimaryKey val id: Int,
    val firstName: String?,
    @Embedded val address: Address?
)

জাভা

public class Address {
    public String street;
    public String state;
    public String city;

    @ColumnInfo(name = "post_code") public int postCode;
}

@Entity
public class User {
    @PrimaryKey public int id;

    public String firstName;

    @Embedded public Address address;
}

একটি User অবজেক্টের প্রতিনিধিত্বকারী টেবিলটিতে id , firstName , street , state , city এবং post_code নামের কলামগুলো থাকে।

যদি কোনো এনটিটিতে একই ধরনের একাধিক এমবেডেড ফিল্ড থাকে, তাহলে আপনি prefix প্রপার্টি সেট করে প্রতিটি কলামকে স্বতন্ত্র রাখতে পারেন। এরপর Room এমবেডেড অবজেক্টের প্রতিটি কলাম নামের শুরুতে প্রদত্ত মানটি যোগ করে দেয়।

অতিরিক্ত সম্পদ

Room-এ এনটিটিগুলোর মধ্যে সম্পর্ক নির্ধারণ সম্পর্কে আরও জানতে, নিম্নলিখিত অতিরিক্ত রিসোর্সগুলো দেখুন।

ভিডিও

ব্লগ