طرحواره های اتصال داده را طراحی کنید

با Firebase Data Connect ، شما یک طرح GraphQL طراحی می کنید که مدل داده مورد نیاز برای برنامه شما را نشان می دهد. Data Connect این طرح را به Cloud SQL برای نمونه PostgreSQL تبدیل می کند که از برنامه شما پشتیبانی می کند. سپس پرس و جوها و جهش ها را می نویسید تا با پشتیبان ارتباط برقرار کنید و این عملیات را در کانکتورهایی برای استفاده از داده های خود از کد مشتری قرار دهید.

Data Connect ابزار هوش مصنوعی را برای کمک به طراحی و پیاده سازی طرحواره های خود ارائه می دهد. این راهنما مفاهیم مهم طراحی طرحواره را برای پشتیبانی و تکمیل جریان های کاری استاندارد و با کمک هوش مصنوعی هنگام شروع توسعه یک برنامه و فراتر از آن معرفی می کند.

راهنمای شروع یک طرح برنامه بررسی فیلم برای PostgreSQL معرفی شد.

این راهنما آن طرح را بیشتر توسعه می دهد و فهرستی SQL معادل طرح نهایی برنامه بررسی فیلم ارائه می دهد.

طرحی برای یک برنامه بررسی فیلم

تصور کنید می خواهید سرویسی بسازید که به کاربران اجازه می دهد نظرات فیلم را ارسال و مشاهده کنند.

برای پشتیبانی از پرس و جوهای اولیه، برای چنین برنامه ای به یک طرح اولیه نیاز دارید. بعداً این طرح را برای ایجاد پرس و جوهای رابطه ای پیچیده گسترش خواهید داد.

در Data Connect ، انواع GraphQL را برای تعریف شکل داده هایی که مشتریان شما می توانند جستجو و دستکاری کنند، تعریف می کنید. هنگامی که شما طرحواره خود را می نویسید، انواع شما به Cloud SQL برای جداول PostgreSQL ترجمه می شود، اغلب در رابطه مستقیم بین انواع GraphQL و جداول پایگاه داده، اگرچه نگاشت های دیگر نیز امکان پذیر است. این راهنما چند نمونه از پایه تا پیشرفته را نشان می دهد.

یک نوع Movie اصلی را تعریف کنید

می توانید با یک نوع Movie شروع کنید.

طرحواره Movie حاوی دستورالعمل های اصلی مانند:

  • @table(name) و @col(name) برای سفارشی کردن جدول SQL و نام ستون. Data Connect نام‌های snake_case را در صورت عدم مشخص کردن ایجاد می‌کند.
  • @col(dataType) برای سفارشی کردن انواع ستون SQL.
  • @default برای پیکربندی مقادیر پیش‌فرض ستون SQL در حین درج.

برای جزئیات بیشتر، اسناد مرجع برای @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 به طور خودکار از فیلدهای کلیدی در طرحواره های شما جمع آوری می کند. اسکالرهای کلیدی در مورد کارایی هستند و به شما امکان می دهند در یک تماس اطلاعاتی درباره هویت و ساختار داده های خود پیدا کنید. آنها به ویژه زمانی مفید هستند که می خواهید اقدامات متوالی را روی رکوردهای جدید انجام دهید و به یک شناسه منحصر به فرد برای ارسال به عملیات آینده نیاز دارید، و همچنین زمانی که می خواهید به کلیدهای رابطه ای برای انجام عملیات پیچیده تر اضافی دسترسی داشته باشید.

با استفاده از مقادیر سرور ، می توانید به طور موثر به سرور اجازه دهید فیلدهای جداول شما را با استفاده از مقادیر ذخیره شده یا قابل محاسبه بر اساس عبارات خاص CEL سمت سرور در آرگومان expr به صورت پویا پر کند. به عنوان مثال، می‌توانید فیلدی را تعریف کنید که وقتی به فیلد با استفاده از زمان ذخیره‌شده در یک درخواست عملیات دسترسی داده می‌شود، یک مهر زمانی اعمال می‌شود 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

فیلد movie نشان دهنده یک رکورد واحد در جدول Movie است.

از این فیلد برای پرس و جو از یک فیلم با کلید آن استفاده کنید.

query GetMovie($myKey: Movie_Key!) {
  movie(key: $myKey) { title }
}

پرس و جو با
زمینه movies

فیلد movies فهرستی از رکوردها را در جدول Movie نشان می دهد.

از این فیلد برای پرس و جو از چندین فیلم، به عنوان مثال، همه فیلم‌های دارای یک سال معین استفاده کنید.

query GetMovies($myYear: Int!) {
  movies(where: { year: { eq: $myYear } }) { title }
}

پرس و جو با
قسمت actors_on_movies

قسمت actors_on_movies فهرستی از رکوردها را نشان می دهد که جداول Actor و Movie را به هم متصل می کنند. از این فیلد برای پرس و جو از همه بازیگران مرتبط با یک فیلم خاص استفاده کنید.

از این فیلد برای پرس و جو از همه بازیگران مرتبط با یک فیلم خاص استفاده کنید.

  query GetActorsOnMovie($myKey: Movie_Key!) {
    actors_on_movies(where: { movie: { key: { eq: $myKey } } }) {
      actor { name }
    }
  }

با در نظر گرفتن این موضوع، می‌توانید نحوه اجرای عملیات با استفاده از این فیلدها را در راهنمای پیاده‌سازی کوئری‌ها و راهنمای پیاده‌سازی جهش‌ها بخوانید.

مفاهیم طرحواره پیشرفته تر

برای فراتر رفتن از انواع و روابط اساسی اما مفید، به مثال‌هایی در مستندات مرجع مراجعه کنید.

انواع داده های پشتیبانی شده

Data Connect از انواع داده های اسکالر زیر پشتیبانی می کند، با انتساب به انواع PostgreSQL با استفاده از @col(dataType:) .

نوع Data Connect GraphQL توکار نوع یا
نوع سفارشی Data Connect
نوع پیش فرض PostgreSQL پشتیبانی از انواع PostgreSQL
(نام مستعار داخل پرانتز)
رشته GraphQL متن متن
بیت (n)، varbit (n)
char(n)، varchar(n)
بین المللی GraphQL بین المللی Int2 (کوچک، سریال کوچک)،
int4 (عدد صحیح، int، سریال)
شناور GraphQL شناور8 float4 (واقعی)
float8 (دقت دوگانه)
عددی (اعشاری)
بولی GraphQL بولی بولی
UUID سفارشی uuid uuid
Int64 سفارشی bigint int8 (bigint، bigserial)
عددی (اعشاری)
تاریخ سفارشی تاریخ تاریخ
مهر زمان سفارشی timestamptz

timestamptz

توجه: اطلاعات منطقه زمانی محلی ذخیره نمی شود.
PostgreSQL مُهرهای زمانی مانند UTC را تبدیل و ذخیره می کند.

بردار سفارشی بردار

بردار

به انجام جستجوی شباهت برداری با 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);

مراحل بعدی

ممکن است علاقه مند باشید: