Data Connect-Schemas entwerfen

Mit Firebase Data Connect entwerfen Sie ein GraphQL-Schema, das das Datenmodell darstellt, das für Ihre Anwendung erforderlich ist. Data Connect konvertiert dieses Schema in die Cloud SQL for PostgreSQL-Instanz, die Ihre App unterstützt. Anschließend erstellen Sie Abfragen und Mutationen, um mit dem Backend zu interagieren, und bündeln diese Vorgänge in Connectors, damit Sie Ihre Daten aus dem Clientcode verwenden können.

Data Connect bietet KI-Tools, mit denen Sie Ihre Schemas entwerfen und implementieren können. In dieser Anleitung werden wichtige Konzepte des Schemaentwurfs vorgestellt, um Ihre Standard- und KI-gestützten Workflows zu unterstützen und zu ergänzen, wenn Sie mit der Entwicklung einer App beginnen, und darüber hinaus.

In der Anleitung Erste Schritte wurde ein Schema für eine Filmkritik App für PostgreSQL vorgestellt.

In dieser Anleitung wird dieses Schema weiterentwickelt und eine SQL-Liste bereitgestellt, die dem endgültigen Schema der Filmkritik-App entspricht.

Das Schema für eine Filmkritik-App

Angenommen, Sie möchten einen Dienst erstellen, mit dem Nutzer Filmkritiken einreichen und ansehen können.

Für eine solche App benötigen Sie ein anfängliches Schema, das grundlegende Abfragen unterstützt. Sie erweitern dieses Schema später, um komplexe relationale Abfragen zu erstellen.

In Data Connect, definieren Sie GraphQL-Typen , um die Form von Daten zu definieren, die Ihre Clients abfragen und bearbeiten können. Wenn Sie Ihr Schema schreiben, werden Ihre Typen in Cloud SQL for PostgreSQL-Tabellen übersetzt. Meistens besteht eine direkte Beziehung zwischen GraphQL-Typen und Datenbanktabellen, aber auch andere Zuordnungen sind möglich. In dieser Anleitung finden Sie einige Beispiele von einfach bis komplex.

Einen einfachen Movie-Typ definieren

Sie können mit einem Movie-Typ beginnen.

Das Schema für Movie enthält wichtige Anweisungen wie:

  • @table(name) und @col(name), um die SQL-Tabellen- und Spaltennamen anzupassen. Data Connect generiert snake_case-Namen, wenn keine angegeben sind.
  • @col(dataType), um SQL-Spaltentypen anzupassen.
  • @default, um Standardwerte für SQL-Spalten beim Einfügen zu konfigurieren.

Weitere Informationen finden Sie in der Referenzdokumentation zu @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
}

Wichtige Nutzerdaten automatisch in einem User-Typ speichern

Ihre App erfasst Nutzer, daher benötigen Sie einen User-Typ.

Die Anweisung @default ist in diesem Fall besonders nützlich. Das Feld id kann hier automatisch die Nutzer-ID aus der Authentifizierung abrufen. Beachten Sie die Verwendung von @default(expr: "auth.uid") im folgenden Beispiel.

# Users
# Suppose a user can leave reviews for movies
type User @table {
  id: String! @default(expr: "auth.uid")
  username: String! @col(dataType: "varchar(50)")
}

Wichtige Skalare und Serverwerte

Bevor wir uns die Filmkritik-App genauer ansehen, ist es wichtig, die Data Connect wichtigen Skalare und Serverwerte vorzustellen.

Wichtige Skalare sind prägnante Objekt-IDs, die Data Connect automatisch aus Schlüsselfeldern in Ihren Schemas zusammensetzt. Wichtige Skalare sind effizient und ermöglichen es Ihnen, mit einem einzigen Aufruf Informationen zur Identität und Struktur Ihrer Daten zu finden. Sie sind besonders nützlich, wenn Sie sequenzielle Aktionen für neue Datensätze ausführen möchten und eine eindeutige ID benötigen, die an nachfolgende Vorgänge übergeben werden soll. Außerdem können Sie damit auf relationale Schlüssel zugreifen, um zusätzliche komplexere Vorgänge auszuführen.

Mit Serverwerten können Sie Felder in Ihren Tabellen effektiv dynamisch vom Server mit gespeicherten oder leicht berechenbaren Werten füllen lassen. Dies erfolgt gemäß bestimmten serverseitigen CEL-Ausdrücken im expr Argument. Sie können beispielsweise ein Feld mit einem Zeitstempel definieren, der beim Zugriff auf das Feld angewendet wird. Dabei wird die in einer Vorgangsanfrage gespeicherte Zeit verwendet: updatedAt: Timestamp! @default(expr: "request.time").

Viele-zu-viele-Beziehungen in den Typen Actor und MovieActor verarbeiten

Nachdem Sie sich um die Nutzer gekümmert haben, können Sie sich wieder der Modellierung von Filmdaten zuwenden.

Als Nächstes möchten Sie, dass Schauspieler in Ihren Filmen mitspielen.

Die Tabelle Actor ist recht einfach.

# 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)")
}

Wenn Schauspieler in mehreren Filmen mitspielen und Filme mehrere Schauspieler haben sollen, benötigen Sie eine „Verknüpfungstabelle“.

Die Tabelle MovieActor verarbeitet die Viele-zu-viele -Beziehung. Ihr Primärschlüssel ist eine Kombination aus [movie, actor] (den Fremdschlüsselfeldern aus movie und 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
}

Wenn Sie eine SQL-Beziehung in der Tabelle mit einer Fremdschlüsseleinschränkung definieren, Data Connect generiert automatisch das entsprechende Feld auf der anderen Seite. Sie müssen das Feld für die umgekehrte Zuordnung nicht definieren (z.B. von Actor zurück zu MovieActor).

Eins-zu-eins-Beziehungen in einem MovieMetadata-Typ verarbeiten

Erfassen Sie jetzt Filmregisseure und richten Sie eine Eins-zu-eins -Beziehung mit Movie ein.

Mit der Anweisung @ref können Sie Fremdschlüsseleinschränkungen anpassen:

  • @ref(fields) gibt an, welche Fremdschlüsselfelder verwendet werden sollen.
  • @ref(references) gibt die Felder an, auf die in der Zieltabelle verwiesen wird. Standardmäßig ist dies der Primärschlüssel, aber auch @unique-Felder funktionieren. Dies ist eine erweiterte Option. Data Connect kann dies oft für Sie ableiten.

Weitere Informationen finden Sie in der Referenzdokumentation zu @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
}

Aus Ihrem Schema generierte Felder zum Erstellen von Vorgängen verwenden

Ihre Data Connect Vorgänge erweitern eine Reihe von Feldern die automatisch von Data Connect basierend auf den Typen und Typ beziehungen in Ihrem Schema generiert werden. Diese Felder werden von lokalen Tools generiert, wenn Sie Ihr Schema bearbeiten.

Angenommen, Ihr Schema enthält einen Movie-Typ und einen zugehörigen Actor-Typ. Data Connect generiert die Felder movie, movies, actors_on_movies und mehr.

Mit dem
movie Feld abfragen

Das Feld movie steht für einen einzelnen Datensatz in der Movie Tabelle.

Mit diesem Feld können Sie einen einzelnen Film anhand seines Schlüssels abfragen.

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

Mit dem
movies Feld abfragen

Das movies Feld steht für eine Liste von Datensätzen in der Movie Tabelle.

Mit diesem Feld können Sie mehrere Filme abfragen, z. B. alle Filme aus einem bestimmten Jahr.

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

Mit dem
actors_on_movies Feld abfragen

Das Feld actors_on_movies steht für eine Liste von Datensätzen, die die Tabellen Actor und Movie verbinden. Mit diesem Feld können Sie alle Schauspieler abfragen, die mit einem bestimmten Film verknüpft sind.

Mit diesem Feld können Sie alle Schauspieler abfragen, die mit einem bestimmten Film verknüpft sind.

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

Vor diesem Hintergrund können Sie nachlesen, wie Sie Vorgänge mit diesen Feldern implementieren in der Anleitung zum Implementieren von Abfragen und Anleitung zum Implementieren von Mutationen.

Erweiterte Schemakonzepte

Aufzählungsfelder

Data Connect unterstützt Aufzählungsfelder, die PostgreSQL Aufzählungstypen zugeordnet sind. Mit Aufzählungen können Sie schnell eine Liste statischer, vordefinierter Werte mit einer bestimmten Reihenfolge definieren.

Wenn Sie Ihrem Schema eine Aufzählung hinzufügen möchten, deklarieren Sie die Aufzählung und ihre vordefinierten Werte und verweisen Sie dann in Ihrem Typ darauf.

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
}

Im Typ Movie haben wir ein Aufzählungsfeld originalAspectRatio für das Seitenverhältnis hinzugefügt, in dem der Film gedreht wurde, und ein weiteres Feld otherAspectRatios für eine Liste anderer verfügbarer Seitenverhältnisse.

Änderungen an Aufzählungsfeldern verwalten

Sie können Ihrer Aufzählung neue Werte hinzufügen. Die Reihenfolge der Aufzählungsliste ist jedoch sehr wichtig. Fügen Sie neue Werte also mit Bedacht ein. Die einzige vollständig abwärtskompatible Änderung an einer Aufzählung ist das Hinzufügen eines neuen Werts am Ende der Werteliste. Wenn Sie einen neuen Wert zwischen zuvor veröffentlichten Aufzählungen einfügen oder vorhandene Werte neu anordnen, ändert sich die relative Reihenfolge, wenn in Abfragen relative Operatoren wie „kleiner als“ verwendet werden. Das Entfernen oder Umbenennen von Werten ist immer eine nicht abwärtskompatible Änderung.

Sie sollten die Werte in der Liste der Aufzählungswerte niemals neu anordnen. Die Reihenfolge ist wichtig, da sie sich auf die Anwendung von Filtern auswirkt.

Anpassungen an Aufzählungswerten sollten sorgfältig vorgenommen werden, damit ältere Versionen Ihres Vorgangs- oder Clientcodes nicht beschädigt werden. Wenn Sie einen Aufzählungswert entfernen oder umbenennen, müssen Sie darauf achten, dass in Ihrer aktuellen Datenbank keine Instanzen mehr vorhanden sind.

Aufzählungsfelder in Vorgängen und im Clientcode verwenden

Nachdem Sie Ihrem Schema ein Aufzählungsfeld hinzugefügt haben, können Sie dieses Feld in Abfragen und im Clientcode verwenden.

Weitere Informationen zum Schreiben von Abfragen mit Aufzählungen und zum Schreiben von Clientcode, um Anpassungen an Ihren Aufzählungen zuzulassen, finden Sie in der Anleitung zu Abfragen.

Weitere erweiterte Konzepte

Wenn Sie über grundlegende, aber nützliche Typen und Beziehungen hinausgehen möchten, finden Sie Beispiele in der Referenzdokumentation.

Unterstützte Datentypen

Data Connect unterstützt die folgenden skalaren Datentypen, mit Zuweisungen zu PostgreSQL-Typen über @col(dataType:).

Data Connect Typ Integrierter GraphQL-Typ oder
Data Connect benutzerdefinierter Typ
Standard-PostgreSQL-Typ Unterstützte PostgreSQL-Typen
(Alias in Klammern)
String GraphQL Text Text
bit(n), varbit(n)
char(n), varchar(n)
Integer GraphQL int Int2 (smallint, smallserial),
int4 (integer, int, serial)
Float GraphQL float8 float4 (real)
float8 (double precision)
numeric (decimal)
Boolesch GraphQL boolean boolean
UUID Benutzerdefiniert uuid uuid
INT64 Benutzerdefiniert bigint int8 (bigint, bigserial)
numeric (decimal)
Datum Benutzerdefiniert date date
Zeitstempel Benutzerdefiniert timestamptz

timestamptz

Hinweis:Informationen zur lokalen Zeitzone werden nicht gespeichert.
PostgreSQL konvertiert und speichert solche Zeitstempel als UTC.

Aufzählung Benutzerdefiniert enum

enum

Vektor Benutzerdefiniert vector

vector

Weitere Informationen finden Sie unter Vektorsuche mit Vertex AI durchführen.

  • GraphQL List wird einem eindimensionalen Array zugeordnet.
    • [Int] wird beispielsweise int5[] zugeordnet, [Any] wird jsonb[] zugeordnet.
    • Data Connect unterstützt keine geschachtelten Arrays.

Entsprechendes SQL-Schema

-- 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);

Nächste Schritte

Folgendes könnte Sie auch interessieren: