This page was translated by the Cloud Translation API.
Switch to English

আপনার ডাটাবেস গঠন

এই গাইডটিতে ডেটা আর্কিটেকচারের কয়েকটি মূল ধারণা এবং আপনার ফায়ারবেস রিয়েলটাইম ডেটাবেজে জেএসএন ডেটা গঠনের সেরা অনুশীলনগুলির মধ্যে রয়েছে।

সঠিকভাবে কাঠামোগত ডাটাবেস তৈরির জন্য বেশ কিছুটা পূর্বানুমানের প্রয়োজন। সবচেয়ে গুরুত্বপূর্ণ, আপনার প্রক্রিয়াটি যতটা সম্ভব সহজ করার জন্য ডেটা কীভাবে সংরক্ষণ করা হবে এবং পরে পুনরুদ্ধার করা হবে তা নিয়ে আপনার পরিকল্পনা করা দরকার।

ডেটা কীভাবে কাঠামোযুক্ত: এটি একটি জেএসওন ট্রি

সমস্ত ফায়ারবেস রিয়েলটাইম ডেটাবেস ডেটা JSON অবজেক্ট হিসাবে সঞ্চিত। আপনি ক্লাউড-হোস্ট করা JSON ট্রি হিসাবে ডাটাবেসটিকে ভাবতে পারেন। কোনও এসকিউএল ডাটাবেসের বিপরীতে, কোনও সারণী বা রেকর্ড নেই। আপনি যখন JSON গাছের সাথে ডেটা যুক্ত করবেন, এটি কোনও বিদ্যমান কী সহ বিদ্যমান জেএসওএন কাঠামোর নোড হয়ে যায়। আপনি নিজের নিজস্ব কী সরবরাহ করতে পারেন, যেমন ব্যবহারকারীর আইডি বা শব্দার্থের নাম, বা সেগুলি আপনার জন্য push() ব্যবহার করে সরবরাহ করা যেতে পারে।

যদি আপনি নিজের কীগুলি তৈরি করেন তবে সেগুলি অবশ্যই ইউটিএফ -8 এনকোড হওয়া উচিত, সর্বাধিক 768 বাইট হতে পারে এবং এতে থাকতে পারে না . , $ , # , [ , ] , / , বা এএসসিআইআই নিয়ন্ত্রণ অক্ষর 0-31 বা 127. আপনি নিজেই মানগুলিতে ASCII নিয়ন্ত্রণ অক্ষর ব্যবহার করতে পারবেন না।

উদাহরণস্বরূপ, একটি চ্যাট অ্যাপ্লিকেশনটি বিবেচনা করুন যা ব্যবহারকারীদের একটি প্রাথমিক প্রোফাইল এবং যোগাযোগের তালিকা সঞ্চয় করতে দেয়। একটি সাধারণ ব্যবহারকারীর প্রোফাইল একটি পাথে অবস্থিত, যেমন /users/$uid । ব্যবহারকারীর alovelace একটি ডাটাবেস এন্ট্রি থাকতে পারে যা দেখতে এরকম কিছু দেখাচ্ছে:

{
  "users": {
    "alovelace": {
      "name": "Ada Lovelace",
      "contacts": { "ghopper": true },
    },
    "ghopper": { ... },
    "eclarke": { ... }
  }
}

যদিও ডাটাবেস একটি JSON ট্রি ব্যবহার করে, ডাটাবেসে সঞ্চিত ডেটা এমন নির্দিষ্ট নেটিভ প্রকার হিসাবে উপস্থাপিত হতে পারে যা আপনাকে আরও রক্ষণাবেক্ষণযোগ্য কোড লিখতে সহায়তা করার জন্য উপলব্ধ জেএসওএন প্রকারের সাথে সামঞ্জস্য করে।

ডেটা কাঠামোর জন্য সেরা অনুশীলন

নেস্টিং ডেটা এড়িয়ে চলুন

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

নেস্টেড ডেটা কেন খারাপ, তার উদাহরণের জন্য নিম্নলিখিত গুণক-নেস্টেড কাঠামোটি বিবেচনা করুন:

{
  // This is a poorly nested data architecture, because iterating the children
  // of the "chats" node to get a list of conversation titles requires
  // potentially downloading hundreds of megabytes of messages
  "chats": {
    "one": {
      "title": "Historical Tech Pioneers",
      "messages": {
        "m1": { "sender": "ghopper", "message": "Relay malfunction found. Cause: moth." },
        "m2": { ... },
        // a very long list of messages
      }
    },
    "two": { ... }
  }
}

এই নেস্টেড ডিজাইনের সাহায্যে ডেটা দিয়ে পুনরাবৃত্তি সমস্যাযুক্ত হয়ে ওঠে। উদাহরণস্বরূপ, চ্যাট কথোপকথনের শিরোনাম তালিকাভুক্ত করার জন্য ক্লায়েন্টে ডাউনলোড করা সমস্ত সদস্য এবং বার্তা সহ পুরো chats ট্রি প্রয়োজন।

সমতল ডেটা স্ট্রাকচার

যদি ডেটা পরিবর্তে পৃথক পাথে ভাগ করা হয়, একে ডেনারমালাইজেশনও বলা হয়, এটি প্রয়োজন হিসাবে এটি দক্ষতার সাথে আলাদা কলগুলিতে ডাউনলোড করা যেতে পারে। এই সমতল কাঠামো বিবেচনা করুন:

{
  // Chats contains only meta info about each conversation
  // stored under the chats's unique ID
  "chats": {
    "one": {
      "title": "Historical Tech Pioneers",
      "lastMessage": "ghopper: Relay malfunction found. Cause: moth.",
      "timestamp": 1459361875666
    },
    "two": { ... },
    "three": { ... }
  },

  // Conversation members are easily accessible
  // and stored by chat conversation ID
  "members": {
    // we'll talk about indices like this below
    "one": {
      "ghopper": true,
      "alovelace": true,
      "eclarke": true
    },
    "two": { ... },
    "three": { ... }
  },

  // Messages are separate from data we may want to iterate quickly
  // but still easily paginated and queried, and organized by chat
  // conversation ID
  "messages": {
    "one": {
      "m1": {
        "name": "eclarke",
        "message": "The relay seems to be malfunctioning.",
        "timestamp": 1459361875337
      },
      "m2": { ... },
      "m3": { ... }
    },
    "two": { ... },
    "three": { ... }
  }
}

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

স্কেল করে এমন ডেটা তৈরি করুন

অ্যাপ্লিকেশনগুলি তৈরি করার সময়, তালিকার একটি উপসেটটি ডাউনলোড করা প্রায়শই ভাল। তালিকায় কয়েক হাজার রেকর্ড রয়েছে তবে এটি বিশেষত সাধারণ। যখন এই সম্পর্ক স্থির এবং এক-দিকনির্দেশক হয়, আপনি কেবল পিতামাতার অধীনে বাচ্চাদের জিনিসগুলিতে বাসা বাঁধতে পারেন।

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

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

যা প্রয়োজন তা হ'ল ব্যবহারকারীর অন্তর্ভুক্ত গ্রুপগুলির তালিকা তৈরি করার একটি দুর্দান্ত উপায় এবং সেই গোষ্ঠীগুলির জন্য কেবল ডেটা আনা। গোষ্ঠীগুলির একটি সূচক এখানে প্রচুর পরিমাণে সহায়তা করতে পারে:

// An index to track Ada's memberships
{
  "users": {
    "alovelace": {
      "name": "Ada Lovelace",
      // Index Ada's groups in her profile
      "groups": {
         // the value here doesn't matter, just that the key exists
         "techpioneers": true,
         "womentechmakers": true
      }
    },
    ...
  },
  "groups": {
    "techpioneers": {
      "name": "Historical Tech Pioneers",
      "members": {
        "alovelace": true,
        "ghopper": true,
        "eclarke": true
      }
    },
    ...
  }
}

আপনি খেয়াল করতে পারেন যে এটি আদার রেকর্ড এবং গোষ্ঠী উভয়ের অধীনে সম্পর্ক সংরক্ষণ করে কিছু ডেটা নকল করে। এখন alovelace একটি গোষ্ঠীর অধীনে alovelace করা হয়েছে, এবং techpioneers অ্যাডার প্রোফাইলে তালিকাভুক্ত হয়েছেন। সুতরাং গ্রুপ থেকে অ্যাডা মুছতে, এটি দুটি স্থানে আপডেট করতে হবে।

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

এই পদ্ধতিটি, আইডিগুলি কী হিসাবে তালিকাভুক্ত করে এবং মানটিকে সত্য হিসাবে নির্ধারণ করে ডেটা উল্টিয়ে দেয়, কী /users/$uid/groups/$group_id পড়ার /users/$uid/groups/$group_id মতো চাবির জন্য পরীক্ষা করা এবং এটি null কিনা তা পরীক্ষা করে তোলে। সূচিটি ডেটা অনুসন্ধান বা স্ক্যান করার চেয়ে দ্রুত এবং একটি ভাল চুক্তি।

পরবর্তী পদক্ষেপ