Firebase Data Connect সাহায্যে, আপনি একটি GraphQL স্কিমা ডিজাইন করেন যা আপনার অ্যাপ্লিকেশনের জন্য প্রয়োজনীয় ডেটা মডেলের প্রতিনিধিত্ব করে। Data Connect এই স্কিমাটিকে Cloud SQL for PostgreSQL ইনস্ট্যান্সে রূপান্তর করে যা আপনার অ্যাপকে সমর্থন করে। এরপর আপনি ব্যাকএন্ডের সাথে ইন্টারফেস করার জন্য কোয়েরি এবং মিউটেশন লেখেন এবং ক্লায়েন্ট কোড থেকে আপনার ডেটা ব্যবহার করার জন্য এই ক্রিয়াকলাপগুলিকে সংযোগকারীতে বান্ডিল করেন।
Data Connect আপনার স্কিমা ডিজাইন এবং বাস্তবায়নে সাহায্য করার জন্য AI টুলিং অফার করে। এই নির্দেশিকাটি স্কিমা ডিজাইনের গুরুত্বপূর্ণ ধারণাগুলি উপস্থাপন করে যা আপনার স্ট্যান্ডার্ড এবং AI-সহায়তাপ্রাপ্ত কর্মপ্রবাহকে সমর্থন এবং পরিপূরক করে যখন আপনি একটি অ্যাপ তৈরি শুরু করেন এবং তার পরেও ।
শুরু করার নির্দেশিকাটি PostgreSQL-এর জন্য একটি মুভি রিভিউ অ্যাপ স্কিমা চালু করেছে।
এই নির্দেশিকাটি সেই স্কিমাটিকে আরও বিকশিত করে এবং চূড়ান্ত মুভি রিভিউ অ্যাপ স্কিমার সমতুল্য একটি SQL তালিকা প্রদান করে।
একটি সিনেমা পর্যালোচনা অ্যাপের স্কিমা
কল্পনা করুন আপনি এমন একটি পরিষেবা তৈরি করতে চান যা ব্যবহারকারীদের সিনেমার পর্যালোচনা জমা দিতে এবং দেখতে দেয়।
এই ধরনের অ্যাপের জন্য মৌলিক প্রশ্নগুলি সমর্থন করার জন্য আপনার একটি প্রাথমিক স্কিমা প্রয়োজন। জটিল রিলেশনাল কোয়েরি তৈরি করার জন্য আপনি পরে এই স্কিমাটি প্রসারিত করবেন।
Data Connect এ, আপনি GraphQL প্রকারগুলি সংজ্ঞায়িত করবেন যাতে আপনার ক্লায়েন্টরা যে ডেটা অনুসন্ধান এবং পরিচালনা করতে পারে তার আকার নির্ধারণ করা যায়। আপনি যখন আপনার স্কিমা লেখেন, তখন আপনার প্রকারগুলি PostgreSQL টেবিলের জন্য Cloud SQL-এ অনুবাদ করা হয়, প্রায়শই GraphQL প্রকার এবং ডাটাবেস টেবিলের মধ্যে সরাসরি সম্পর্কের ক্ষেত্রে, যদিও অন্যান্য ম্যাপিং সম্ভব। এই নির্দেশিকাটি মৌলিক থেকে আরও উন্নত পর্যন্ত কিছু উদাহরণ দেখায়।
একটি মৌলিক Movie ধরণ নির্ধারণ করুন
আপনি একটি Movie টাইপ দিয়ে শুরু করতে পারেন।
Movie স্কিমায় মূল নির্দেশিকা রয়েছে যেমন:
-
@table(name)এবং@col(name)করে SQL টেবিল এবং কলামের নাম কাস্টমাইজ করা যায়। 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 ধরণ প্রয়োজন।
@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 ক্ষেত্র
| একটি সিনেমার কী ব্যবহার করে জিজ্ঞাসা করতে এই ক্ষেত্রটি ব্যবহার করুন। 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 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-এর মধ্যে একটি নতুন মান সন্নিবেশ করানো বা বিদ্যমান মানগুলিকে পুনর্বিন্যাস করা আপেক্ষিক ক্রম পরিবর্তন করে যখন "less than" এর মতো আপেক্ষিক অপারেটরগুলি কোয়েরিতে ব্যবহার করা হয়। মানগুলি অপসারণ বা পুনঃনামকরণ সর্বদা একটি বিপরীতমুখী-অসঙ্গত পরিবর্তন।
আপনার কখনই enum মান তালিকার মানগুলি পুনর্বিন্যাস করা উচিত নয়; ক্রমটি গুরুত্বপূর্ণ কারণ এটি ফিল্টারিং কীভাবে প্রয়োগ করা হয় তা পরিবর্তন করে।
enum মানগুলির সমন্বয় সাবধানতার সাথে করা উচিত যাতে আপনার অপারেশন বা ক্লায়েন্ট কোডের পুরানো সংস্করণগুলি ভেঙে না যায়। enum মান অপসারণ বা পুনঃনামকরণ করার সময়, নিশ্চিত করুন যে আপনার বর্তমান ডাটাবেসে কোনও অবশিষ্ট উদাহরণ নেই।
অপারেশন এবং ক্লায়েন্ট কোডে আপনার enum ক্ষেত্রগুলি ব্যবহার করা
এখন যেহেতু আপনি আপনার স্কিমায় একটি enum ফিল্ড যোগ করেছেন, আপনি এই ফিল্ডটি কোয়েরি এবং ক্লায়েন্ট কোডে ব্যবহার করতে পারেন।
enums ব্যবহার করে কোয়েরি লেখা এবং আপনার enums-এ সমন্বয় করার জন্য ক্লায়েন্ট কীভাবে লিখবেন সে সম্পর্কে আরও জানুন কোয়েরি গাইড থেকে।
অন্যান্য উন্নত ধারণা
মৌলিক কিন্তু কার্যকর ধরণ এবং সম্পর্কের বাইরে যেতে, রেফারেন্স ডকুমেন্টেশনের উদাহরণগুলি দেখুন।
সমর্থিত ডেটা প্রকার
Data Connect নিম্নলিখিত স্কেলার ডেটা টাইপগুলিকে সমর্থন করে, @col(dataType:) ব্যবহার করে PostgreSQL টাইপগুলিতে অ্যাসাইনমেন্ট সহ।
| Data Connect ধরণ | GraphQL বিল্ট-ইন টাইপ অথবা Data Connect কাস্টম টাইপ | ডিফল্ট PostgreSQL টাইপ | সমর্থিত PostgreSQL প্রকারগুলি (বন্ধনীতে উপনাম) |
|---|---|---|---|
| স্ট্রিং | গ্রাফকিউএল | টেক্সট | টেক্সট বিট(n), ভারবিট(n) অক্ষর(n), ভার্চার(n) |
| ইন্ট | গ্রাফকিউএল | int-এর মাধ্যমে | Int2 (smallint, smallserial), int4 (পূর্ণসংখ্যা, int, সিরিয়াল) |
| ভাসা | গ্রাফকিউএল | ভাসমান৮ | float4 (বাস্তব) float8 (দ্বৈত নির্ভুলতা) সংখ্যাসূচক (দশমিক) |
| বুলিয়ান | গ্রাফকিউএল | বুলিয়ান | বুলিয়ান |
| ইউইউআইডি | কাস্টম | উউইদ | উউইদ |
| Int64 সম্পর্কে | কাস্টম | বিগিন্ট | int8 (বিগইন্ট, বিগসিরিয়াল) সংখ্যাসূচক (দশমিক) |
| তারিখ | কাস্টম | তারিখ | তারিখ |
| টাইমস্ট্যাম্প | কাস্টম | টাইমস্ট্যাম্পটজ | টাইমস্ট্যাম্পটজ দ্রষ্টব্য: স্থানীয় সময় অঞ্চলের তথ্য সংরক্ষণ করা হয় না। |
| গণনা | কাস্টম | এনাম | এনাম |
| ভেক্টর | কাস্টম | ভেক্টর | ভেক্টর |
- 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);
পরবর্তী পদক্ষেপ
আপনার আগ্রহ থাকতে পারে:
- AI সহায়তা সরঞ্জাম ব্যবহার করে আপনার অ্যাপের জন্য স্কিমা তৈরি করা
- সিনট্যাক্স রেফারেন্স ডকুমেন্টেশন পর্যালোচনা করা হচ্ছে।