Spring Cloud Cloud Spanner 關(guān)系

2024-01-11 14:54 更新

Spring Data Cloud Spanner使用Cloud Spanner 父子交錯(cuò)表機(jī)制支持父子關(guān)系 Cloud Spanner交錯(cuò)表強(qiáng)制一對(duì)多關(guān)系,并在單個(gè)域父實(shí)體的實(shí)體上提供有效的查詢和操作。這些關(guān)系最多可以達(dá)到7個(gè)層次。Cloud Spanner還提供了自動(dòng)級(jí)聯(lián)刪除或強(qiáng)制刪除父級(jí)之前的子實(shí)體。

盡管可以使用交錯(cuò)的父子表構(gòu)建在Cloud Spanner和Spring Data Cloud Spanner中實(shí)現(xiàn)一對(duì)一和多對(duì)多關(guān)系,但僅本地支持父子關(guān)系。Cloud Spanner不支持外鍵約束,盡管父子鍵約束在與交錯(cuò)表一起使用時(shí)會(huì)強(qiáng)制執(zhí)行類似的要求。

例如,以下Java實(shí)體:

@Table(name = "Singers")
class Singer {
  @PrimaryKey
  long SingerId;

  String FirstName;

  String LastName;

  byte[] SingerInfo;

  @Interleaved
  List<Album> albums;
}

@Table(name = "Albums")
class Album {
  @PrimaryKey
  long SingerId;

  @PrimaryKey(keyOrder = 2)
  long AlbumId;

  String AlbumTitle;
}

這些類可以對(duì)應(yīng)于一對(duì)現(xiàn)有的交錯(cuò)表。@Interleaved批注可以應(yīng)用于Collection屬性,并且內(nèi)部類型被解析為子實(shí)體類型。創(chuàng)建它們所需的架構(gòu)也可以使用SpannerSchemaUtils生成,并使用SpannerDatabaseAdminTemplate執(zhí)行:

@Autowired
SpannerSchemaUtils schemaUtils;

@Autowired
SpannerDatabaseAdminTemplate databaseAdmin;
...

// Get the create statmenets for all tables in the table structure rooted at Singer
List<String> createStrings = this.schemaUtils.getCreateTableDdlStringsForInterleavedHierarchy(Singer.class);

// Create the tables and also create the database if necessary
this.databaseAdmin.executeDdlStrings(createStrings, true);

createStrings列表包含表架構(gòu)語(yǔ)句,這些語(yǔ)句使用與提供的Java類型兼容的列名稱和類型,以及根據(jù)配置的自定義轉(zhuǎn)換器包含在其中的任何已解析子關(guān)系類型。

CREATE TABLE Singers (
  SingerId   INT64 NOT NULL,
  FirstName  STRING(1024),
  LastName   STRING(1024),
  SingerInfo BYTES(MAX),
) PRIMARY KEY (SingerId);

CREATE TABLE Albums (
  SingerId     INT64 NOT NULL,
  AlbumId      INT64 NOT NULL,
  AlbumTitle   STRING(MAX),
) PRIMARY KEY (SingerId, AlbumId),
  INTERLEAVE IN PARENT Singers ON DELETE CASCADE;

ON DELETE CASCADE子句表示如果刪除歌手,則Cloud Spanner會(huì)刪除該歌手的所有專輯。另一種選擇是ON DELETE NO ACTION,在此歌手要?jiǎng)h除所有歌手的專輯之后才能刪除。使用SpannerSchemaUtils生成架構(gòu)字符串時(shí),spring.cloud.gcp.spanner.createInterleavedTableDdlOnDeleteCascade布爾設(shè)置確定這些架構(gòu)是針對(duì)trueON DELETE CASCADE還是針對(duì)falseON DELETE NO ACTION生成的。

Cloud Spanner將這些關(guān)系限制為7個(gè)子層。一個(gè)表可能有多個(gè)子表。

在將對(duì)象更新或插入Cloud Spanner時(shí),其所有引用的子對(duì)象也將分別更新或插入同一請(qǐng)求中。在讀取時(shí),所有交錯(cuò)的子行也都被讀取。

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)