Firebase Data Connect সাহায্যে, আপনি একটি GraphQL স্কিমা ডিজাইন করেন যা আপনার অ্যাপ্লিকেশনের জন্য প্রয়োজনীয় ডেটা মডেলকে উপস্থাপন করে। Data Connect এই স্কিমাটিকে Cloud SQL for PostgreSQL ইনস্ট্যান্সে রূপান্তর করে, যা আপনার অ্যাপকে সমর্থন করে। এরপর আপনি ব্যাকএন্ডের সাথে ইন্টারফেস করার জন্য কোয়েরি এবং মিউটেশন তৈরি করেন এবং ক্লায়েন্ট কোড থেকে আপনার ডেটা ব্যবহারের জন্য এই অপারেশনগুলোকে কানেক্টরের মধ্যে বান্ডল করেন।
Data Connect আপনার স্কিমা ডিজাইন ও বাস্তবায়নে সাহায্য করার জন্য এআই টুলিং প্রদান করে। এই নির্দেশিকাটি স্কিমা ডিজাইনের গুরুত্বপূর্ণ ধারণাগুলো তুলে ধরে, যা একটি অ্যাপ তৈরি শুরু করার সময় এবং তার পরেও আপনার প্রচলিত ও এআই-সহায়তাযুক্ত কর্মপ্রবাহকে সমর্থন ও পরিপূরক করবে।
গেট স্টার্টেড গাইডটিতে PostgreSQL-এর জন্য একটি মুভি রিভিউ অ্যাপ স্কিমা উপস্থাপন করা হয়েছে।
এই নির্দেশিকাটি সেই স্কিমাটিকে আরও উন্নত করে এবং চূড়ান্ত মুভি রিভিউ অ্যাপ স্কিমার সমতুল্য একটি SQL লিস্টিং প্রদান করে।
একটি চলচ্চিত্র পর্যালোচনা অ্যাপের নকশা
ধরুন, আপনি এমন একটি পরিষেবা তৈরি করতে চান যা ব্যবহারকারীদের সিনেমার রিভিউ জমা দিতে এবং দেখতে দেবে।
এই ধরনের একটি অ্যাপের জন্য সাধারণ কোয়েরি সমর্থন করতে একটি প্রাথমিক স্কিমা প্রয়োজন। পরবর্তীতে জটিল রিলেশনাল কোয়েরি তৈরি করার জন্য আপনি এই স্কিমাটি সম্প্রসারণ করবেন।
Data Connect এ, আপনার ক্লায়েন্টরা যে ডেটা কোয়েরি ও ম্যানিপুলেট করতে পারবে, তার কাঠামো নির্ধারণ করার জন্য আপনি GraphQL টাইপ সংজ্ঞায়িত করবেন। যখন আপনি আপনার স্কিমা লিখবেন, তখন আপনার টাইপগুলো Cloud SQL for PostgreSQL টেবিলে রূপান্তরিত হয়। এক্ষেত্রে বেশিরভাগ সময় GraphQL টাইপ এবং ডাটাবেস টেবিলের মধ্যে একটি সরাসরি সম্পর্ক তৈরি হয়, যদিও অন্যান্য ম্যাপিংও সম্ভব। এই নির্দেশিকাটিতে প্রাথমিক থেকে শুরু করে আরও উন্নত স্তরের কিছু উদাহরণ দেখানো হয়েছে।
একটি মৌলিক Movie ধরণ সংজ্ঞায়িত করুন
আপনি Movie টাইপ দিয়ে শুরু করতে পারেন।
Movie এর স্কিমাতে নিম্নলিখিত মূল নির্দেশাবলী অন্তর্ভুক্ত রয়েছে:
- SQL টেবিল এবং কলামের নাম কাস্টমাইজ করতে
@table(name)এবং@col(name)ব্যবহার করুন। নির্দিষ্ট করে না দেওয়া হলে Data Connect স্বয়ংক্রিয়ভাবে snake_case পদ্ধতিতে নাম তৈরি করে। - SQL কলামের ধরন কাস্টমাইজ করতে
@col(dataType)ব্যবহার করুন। - ইনসার্ট করার সময় SQL কলামের ডিফল্ট মান সেট করার জন্য
@defaultহয়।
আরও বিস্তারিত জানতে, @table , @col , @default -এর রেফারেন্স ডক্স দেখুন।
# Movies
type Movie @table(name: "movie", key: "id") {
id: UUID! @col(name: "movie_id") @default(expr: "uuidV4()")
title: String!
releaseYear: Int
genre: String @col(dataType: "varchar(20)")
rating: Int
description: String
}
ব্যবহারকারীর গুরুত্বপূর্ণ তথ্য স্বয়ংক্রিয়ভাবে একটি User টাইপে সংরক্ষণ করুন।
আপনার অ্যাপ ব্যবহারকারীদের তথ্য সংরক্ষণ করবে, তাই আপনার একটি ব্যবহারকারীর ধরন User type) প্রয়োজন।
এই ক্ষেত্রে @default ডিরেক্টিভটি বিশেষভাবে উপযোগী। এখানকার id ফিল্ডটি অথেনটিকেশন থেকে স্বয়ংক্রিয়ভাবে ব্যবহারকারীর আইডি নিয়ে নিতে পারে: নিচের নমুনাটিতে @default(expr: "auth.uid") এর ব্যবহার লক্ষ্য করুন।
# Users
# Suppose a user can leave reviews for movies
type User @table {
id: String! @default(expr: "auth.uid")
username: String! @col(dataType: "varchar(50)")
}
মূল স্কেলার এবং সার্ভার মান
মুভি রিভিউ অ্যাপটি নিয়ে আরও বিস্তারিত আলোচনার আগে, Data Connect মূল স্কেলার এবং সার্ভার ভ্যালুগুলোর সাথে পরিচয় করিয়ে দেওয়া জরুরি।
কী স্কেলার হলো সংক্ষিপ্ত অবজেক্ট আইডেন্টিফায়ার যা Data Connect আপনার স্কিমার কী ফিল্ডগুলো থেকে স্বয়ংক্রিয়ভাবে তৈরি করে। কী স্কেলারের মূল উদ্দেশ্য হলো কার্যকারিতা বৃদ্ধি করা, যা আপনাকে একটিমাত্র কলের মাধ্যমেই আপনার ডেটার পরিচয় এবং কাঠামো সম্পর্কিত তথ্য খুঁজে পেতে সাহায্য করে। এগুলি বিশেষভাবে উপযোগী যখন আপনি নতুন রেকর্ডের উপর ধারাবাহিক কাজ সম্পাদন করতে চান এবং পরবর্তী অপারেশনগুলিতে পাঠানোর জন্য একটি অনন্য আইডেন্টিফায়ারের প্রয়োজন হয়, এবং যখন আপনি অতিরিক্ত ও আরও জটিল অপারেশন সম্পাদনের জন্য রিলেশনাল কী অ্যাক্সেস করতে চান।
সার্ভার ভ্যালু ব্যবহার করে, আপনি expr আর্গুমেন্টে থাকা নির্দিষ্ট সার্ভার-সাইড CEL এক্সপ্রেশন অনুযায়ী সংরক্ষিত বা সহজে গণনাযোগ্য ভ্যালু ব্যবহার করে সার্ভারকে আপনার টেবিলের ফিল্ডগুলো ডায়নামিকভাবে পূরণ করতে দিতে পারেন। উদাহরণস্বরূপ, আপনি একটি অপারেশন রিকোয়েস্টে সংরক্ষিত সময় ব্যবহার করে এমন একটি ফিল্ড সংজ্ঞায়িত করতে পারেন যেখানে ফিল্ডটি অ্যাক্সেস করার সময় একটি টাইমস্ট্যাম্প প্রয়োগ করা হয়, updatedAt: Timestamp! @default(expr: "request.time") ।
Actor এবং MovieActor ক্ষেত্রে বহু-সম্পর্ক পরিচালনা করুন
ব্যবহারকারীদের কাজ সম্পন্ন হলে, আপনি সিনেমার ডেটা মডেলিংয়ের কাজে ফিরে যেতে পারেন।
এরপর, আপনি চান আপনার সিনেমায় অভিনেতারা অভিনয় করুক।
Actor টেবিলটি বেশ সহজবোধ্য।
# Actors
# Suppose an actor can participate in multiple movies and movies can have multiple actors
# Movie - Actors (or vice versa) is a many to many relationship
type Actor @table {
id: UUID! @default(expr: "uuidV4()")
name: String! @col(dataType: "varchar(30)")
}
যদি আপনি চান যে অভিনেতারা একাধিক চলচ্চিত্রে অভিনয় করুক এবং চলচ্চিত্রগুলোতেও একাধিক অভিনেতা থাকুক, তাহলে আপনার একটি 'জয়েন টেবিল' লাগবে।
MovieActor টেবিলটি মেনি-টু-মেনি সম্পর্ক পরিচালনা করে, এবং এর প্রাইমারি কী হলো [movie, actor] এর একটি সংমিশ্রণ (যা movie এবং actor থেকে নেওয়া ফরেন কী ফিল্ড)।
# Join table for many-to-many relationship for movies and actors
# The 'key' param signifies the primary keys of this table
# In this case, the keys are [movieId, actorId], the foreign key fields of the reference fields [movie, actor]
type MovieActor @table(key: ["movie", "actor"]) {
movie: Movie!
# movieId: UUID! <- implicitly added foreign key field
actor: Actor!
# actorId: UUID! <- implicitly added foreign key field
role: String! # "main" or "supporting"
# optional other fields
}
যখন আপনি একটি ফরেন কী কনস্ট্রেইন্ট সহ টেবিলে একটি SQL রিলেশনশিপ সংজ্ঞায়িত করেন, তখন Data Connect স্বয়ংক্রিয়ভাবে অপর প্রান্তে সংশ্লিষ্ট ফিল্ডটি তৈরি করে। আপনাকে বিপরীত ম্যাপিং ফিল্ড (যেমন, Actor থেকে MovieActor ) সংজ্ঞায়িত করার প্রয়োজন নেই।
MovieMetadata টাইপে এক-এক সম্পর্ক পরিচালনা করুন
এখন, চলচ্চিত্র পরিচালকদের উপর নজর রাখুন, সেইসাথে Movie সাথে একটি ব্যক্তিগত সম্পর্ক স্থাপন করুন।
আপনি ফরেন কী কনস্ট্রেইন্ট কাস্টমাইজ করতে @ref ডিরেক্টিভটি ব্যবহার করতে পারেন:
-
@ref(fields)নির্দিষ্ট করে দেয় কোন ফরেন কী ফিল্ডগুলো ব্যবহার করতে হবে। -
@ref(references)টার্গেট টেবিলে উল্লেখিত ফিল্ডগুলো নির্দিষ্ট করে (ডিফল্ট হিসেবে প্রাইমারি কী ব্যবহৃত হয়, তবে@uniqueফিল্ডও কাজ করে)। এটি একটি অপেক্ষাকৃত উন্নত বিকল্প; Data Connect প্রায়শই আপনার জন্য এটি অনুমান করে নিতে পারে।
আরও বিস্তারিত জানতে, @ref এর রেফারেন্স ডক্স দেখুন।
# Movie Metadata
# Movie - MovieMetadata is a one-to-one relationship
type MovieMetadata @table {
# @unique ensures that each Movie only has one MovieMetadata.
movie: Movie! @unique
# Since it references to another table type, it adds a foreign key constraint.
# movie: Movie! @unique @ref(fields: "movieId", references: "id")
# movieId: UUID! <- implicitly added foreign key field
director: String
}
অপারেশন তৈরি করতে আপনার স্কিমা থেকে তৈরি ফিল্ডগুলি ব্যবহার করুন।
আপনার Data Connect অপারেশনগুলো আপনার স্কিমার টাইপ এবং টাইপ সম্পর্কের উপর ভিত্তি করে Data Connect দ্বারা স্বয়ংক্রিয়ভাবে তৈরি হওয়া এক সেট ফিল্ডকে প্রসারিত করবে। যখনই আপনি আপনার স্কিমা সম্পাদনা করেন, স্থানীয় টুলিং দ্বারা এই ফিল্ডগুলো তৈরি হয়।
ধরে নিন আপনার স্কিমাতে একটি Movie টাইপ এবং এর সাথে যুক্ত একটি Actor টাইপ রয়েছে। Data Connect তখন movie , movies , actors_on_movies ফিল্ড এবং আরও অনেক কিছু তৈরি করে।
প্রশ্ন করুন
movie ক্ষেত্র
| এর কী (key) ব্যবহার করে কোনো একটি নির্দিষ্ট মুভি অনুসন্ধান করতে এই ফিল্ডটি ব্যবহার করুন। query GetMovie($myKey: Movie_Key!) { movie(key: $myKey) { title } } |
প্রশ্ন করুন
movies ক্ষেত্র
| একাধিক সিনেমা অনুসন্ধান করতে এই ক্ষেত্রটি ব্যবহার করুন, উদাহরণস্বরূপ, একটি নির্দিষ্ট বছরের সমস্ত সিনেমা। query GetMovies($myYear: Int!) { movies(where: { year: { eq: $myYear } }) { title } } |
প্রশ্ন করুন
actors_on_movies
| কোনো নির্দিষ্ট চলচ্চিত্রের সঙ্গে যুক্ত সমস্ত অভিনেতাদের সম্পর্কে জানতে এই ক্ষেত্রটি ব্যবহার করুন। query GetActorsOnMovie($myKey: Movie_Key!) { actors_on_movies(where: { movie: { key: { eq: $myKey } } }) { actor { name } } } |
এই বিষয়টি মাথায় রেখে, এই ফিল্ডগুলি ব্যবহার করে কীভাবে অপারেশনগুলি প্রয়োগ করতে হয় তা আপনি "কোয়েরি প্রয়োগ করার নির্দেশিকা" এবং "মিউটেশন প্রয়োগ করার নির্দেশিকা" -তে পড়ে নিতে পারেন।
আরও উন্নত স্কিমা ধারণা
গণনা ক্ষেত্র
Data Connect এমন এনুমারেশন ফিল্ড সমর্থন করে যা পোস্টগ্রেসকিউএল (PostgreSQL) এনুমারেটেড টাইপের সাথে ম্যাপ করা যায়। এনাম (Enum) আপনাকে একটি নির্দিষ্ট ক্রমে স্থির, পূর্বনির্ধারিত মানগুলির একটি তালিকা দ্রুত সংজ্ঞায়িত করতে দেয়।
আপনার স্কিমাতে একটি enum যোগ করতে, enum এবং এর পূর্বনির্ধারিত মানগুলি ঘোষণা করুন, তারপর আপনার টাইপে এটিকে রেফারেন্স করুন।
enum AspectRatio {
ACADEMY
WIDESCREEN
ANAMORPHIC
IMAX
"No information available on aspect ratio"
UNAVAILABLE
}
type Movie
@table {
title: String!
genre: String
description: String
originalAspectRatio: AspectRatio! @default(value: WIDESCREEN)
otherAspectRatios: [AspectRatio!]
tags: [String]
rating: Float
imageUrl: String!
releaseYear: Int
}
Movie টাইপে, আমরা একটি enum ফিল্ড originalAspectRatio যোগ করেছি, যা মুভিটি যে অ্যাস্পেক্ট রেশিওতে ধারণ করা হয়েছিল তা নির্দেশ করে, এবং আরেকটি ফিল্ড otherAspectRatios , যা অন্যান্য উপলব্ধ অ্যাস্পেক্ট রেশিওগুলোর একটি তালিকা দেখায়।
গণনা ক্ষেত্রগুলিতে পরিবর্তনগুলি পরিচালনা করুন
আপনি আপনার এনামে নতুন ভ্যালু যোগ করতে পারেন, কিন্তু এনাম তালিকার ক্রম অত্যন্ত তাৎপর্যপূর্ণ, তাই আপনার নতুন ভ্যালুগুলো বিচক্ষণতার সাথে যুক্ত করুন। একটি এনামে একমাত্র সম্পূর্ণরূপে ব্যাকওয়ার্ডস-কম্প্যাটিবল পরিবর্তন হলো ভ্যালু তালিকার শেষে একটি নতুন ভ্যালু যোগ করা। উল্লেখ্য যে, পূর্বে প্রকাশিত এনামগুলোর মধ্যে একটি নতুন ভ্যালু যুক্ত করা বা বিদ্যমান ভ্যালুগুলোর ক্রম পরিবর্তন করলে, কোয়েরিতে "লেস দ্যান"-এর মতো রিলেটিভ অপারেটর ব্যবহার করার সময় আপেক্ষিক ক্রম পরিবর্তিত হয়। ভ্যালু মুছে ফেলা বা নাম পরিবর্তন করা সর্বদা একটি ব্যাকওয়ার্ডস-ইনকম্প্যাটিবল পরিবর্তন।
enum ভ্যালু লিস্টের ভ্যালুগুলোর ক্রম কখনোই পরিবর্তন করা উচিত নয়; এদের ক্রম গুরুত্বপূর্ণ, কারণ এটি ফিল্টারিং প্রয়োগের পদ্ধতিকে পরিবর্তন করে দেয়।
আপনার অপারেশন বা ক্লায়েন্ট কোডের পুরোনো সংস্করণগুলো যাতে নষ্ট না হয়, সেজন্য enum ভ্যালুগুলো সাবধানে পরিবর্তন করা উচিত। কোনো enum ভ্যালু মুছে ফেলার বা নাম পরিবর্তন করার সময়, নিশ্চিত হয়ে নিন যে আপনার বর্তমান ডেটাবেসে এর কোনো অবশিষ্ট ইনস্ট্যান্স নেই।
অপারেশন এবং ক্লায়েন্ট কোডে আপনার enum ফিল্ড ব্যবহার করা
এখন যেহেতু আপনি আপনার স্কিমাতে একটি enum ফিল্ড যোগ করেছেন, আপনি এই ফিল্ডটি কোয়েরি এবং ক্লায়েন্ট কোডে ব্যবহার করতে পারবেন।
এনাম ব্যবহার করে কোয়েরি লেখা এবং কোয়েরি গাইড থেকে আপনার এনামগুলিতে পরিবর্তন আনার জন্য ক্লায়েন্ট কীভাবে লিখতে হয়, সে সম্পর্কে আরও জানুন।
অন্যান্য উন্নত ধারণা
মৌলিক কিন্তু দরকারি টাইপ ও সম্পর্কগুলোর বাইরে যেতে হলে, রেফারেন্স ডকুমেন্টেশনে দেওয়া উদাহরণগুলো দেখুন।
সমর্থিত ডেটা প্রকার
Data Connect নিম্নলিখিত স্কেলার ডেটা টাইপগুলিকে সমর্থন করে, এবং @col(dataType:) ব্যবহার করে PostgreSQL টাইপগুলিতে এগুলি অ্যাসাইনমেন্ট করা যায়।
| Data Connect ধরণ | GraphQL বিল্ট-ইন টাইপ বা Data Connect কাস্টম টাইপ | ডিফল্ট PostgreSQL টাইপ | সমর্থিত PostgreSQL প্রকার (বন্ধনীতে ছদ্মনাম) |
|---|---|---|---|
| স্ট্রিং | গ্রাফকিউএল | পাঠ্য | পাঠ্য বিট(n), ভ্যারবিট(n) char(n), varchar(n) |
| ইন্ট | গ্রাফকিউএল | int | Int2 (smallint, smallserial), int4 (পূর্ণসংখ্যা, int, সিরিয়াল) |
| ভাসা | গ্রাফকিউএল | ফ্লোট৮ | ফ্লোট৪ (বাস্তব) ফ্লোট৮ (ডাবল প্রিসিশন) সংখ্যাসূচক (দশমিক) |
| বুলিয়ান | গ্রাফকিউএল | বুলিয়ান | বুলিয়ান |
| UUID | কাস্টম | uuid | uuid |
| Int64 | কাস্টম | বড় | int8 (বিগইন্ট, বিগসিরিয়াল) সংখ্যাসূচক (দশমিক) |
| তারিখ | কাস্টম | তারিখ | তারিখ |
| টাইমস্ট্যাম্প | কাস্টম | টাইমস্ট্যাম্পটিজেড | টাইমস্ট্যাম্পটিজেড দ্রষ্টব্য: স্থানীয় সময় অঞ্চলের তথ্য সংরক্ষণ করা হয় না। |
| গণনা | কাস্টম | এনাম | এনাম |
| ভেক্টর | কাস্টম | ভেক্টর | ভেক্টর Vertex AI ব্যবহার করে ভেক্টর সাদৃশ্য অনুসন্ধান সম্পাদন করুন । |
- GraphQL
Listএকটি এক-মাত্রিক অ্যারেতে ম্যাপ করে।- উদাহরণস্বরূপ,
[Int]int5[]-এ ম্যাপ করে,[Any]jsonb[]-এ ম্যাপ করে। - Data Connect নেস্টেড অ্যারে সমর্থন করে না।
- উদাহরণস্বরূপ,
সমতুল্য SQL স্কিমা
-- Movies Table
CREATE TABLE Movies (
movie_id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
title VARCHAR(255) NOT NULL,
release_year INT,
genre VARCHAR(30),
rating INT,
description TEXT,
tags TEXT[]
);
-- Movie Metadata Table
CREATE TABLE MovieMetadata (
movie_id UUID REFERENCES Movies(movie_id) UNIQUE,
director VARCHAR(255) NOT NULL,
PRIMARY KEY (movie_id)
);
-- Actors Table
CREATE TABLE Actors (
actor_id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
name VARCHAR(30) NOT NULL
);
-- MovieActor Join Table for Many-to-Many Relationship
CREATE TABLE MovieActor (
movie_id UUID REFERENCES Movies(movie_id),
actor_id UUID REFERENCES Actors(actor_id),
role VARCHAR(50) NOT NULL, # "main" or "supporting"
PRIMARY KEY (movie_id, actor_id),
FOREIGN KEY (movie_id) REFERENCES Movies(movie_id),
FOREIGN KEY (actor_id) REFERENCES Actors(actor_id)
);
-- Users Table
CREATE TABLE Users (
user_id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
user_auth VARCHAR(255) NOT NULL
username VARCHAR(30) NOT NULL
);
-- Reviews Table
CREATE TABLE Reviews (
review_id UUID DEFAULT uuid_generate_v4() PRIMARY KEY,
user_id UUID REFERENCES Users(user_id),
movie_id UUID REFERENCES Movies(movie_id),
rating INT,
review_text TEXT,
review_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE (movie_id, user_id)
FOREIGN KEY (user_id) REFERENCES Users(user_id),
FOREIGN KEY (movie_id) REFERENCES Movies(movie_id)
);
-- Self Join Example for Movie Sequel Relationship
ALTER TABLE Movies
ADD COLUMN sequel_to UUID REFERENCES Movies(movie_id);
পরবর্তী পদক্ষেপ
আপনি নিম্নলিখিত বিষয়গুলিতে আগ্রহী হতে পারেন:
- এআই সহায়তা টুল ব্যবহার করে আপনার অ্যাপের জন্য স্কিমা তৈরি করা
- সিনট্যাক্স রেফারেন্স ডকুমেন্টেশন পর্যালোচনা করা হচ্ছে।