loopbackio / loopbackio/loopback-next

New syntax for INDEX and FOREIGN KEY definition

オープン
#2,766 コメント 1 件 リアクション 4 件 担当者 0 名 GitHub で見る

まだ誰も着手していません。

feature Repository
主要言語
TypeScript
スター
5.1k
フォーク
1.1k
平均マージ
2日 21時間
マージ済み PR(30日)
27

説明

This is a follow-up task for the proposal outlined in https://github.com/strongloop/loopback-next/issues/2712.

Indexes at property level

Support the following two short-hand forms only. Ask users to use model-level
form to define indexes that are more complex.

  • a "plain" index with no special configuration

    @property({
      type: 'string',
      index: true,
    })
    email: string;
    
  • UNIQUE index with no special configuration

    @property({
      type: 'string',
      unique: true,
    })
    email: string;
    

Indexes at model level

At high-level, keep the current syntax where indexes are defined via a key-value
map stored in settings.indexes property, the key is the index name and the
value is an index definition object.

@model({
  strict: false,
  forceID: true,
  indexes: {
    uniqueEmail: {
      // index definition
    },
    nameQueries: {
      // index definition
    },
  },
})
class MyModel extends Entity {}

Individual indexes can be defined as follows:

  • Add a new field properties as a key-value map from property names to
    indexing order:

    // definition of an individual index
    emailIndex: {
      properties: {
        email: 1, // ASC
        createdAt: 'DESC', // alias for -1
        bio: 'text', // database-specific value (MongoDB's "text")
      }
    }
    

    Important: property names are mapped to database column names when building
    the index definition.

  • Keep supporting keys field as a key-value map from database column name to
    indexing order, see the description of the actual status below. Entries from
    keys should be merged with entries from properties, keys taking
    precedence (replacing properties entries).

  • Keep supporting unique field (set it to true to let the index enforce
    uniqueness).

  • Database-specific options will be stored under a key with the connector name:

    emailIndex: {
      properties: {
        email: 'ASC',
      },
      mongodb: {
        sparse: true,
      },
      mysql: {
        kind: 'fulltext',
        type: 'hash',
      },
      postgresql: {
        type: 'hash',
      }
    }
    

Foreign keys at property level

Introduce a new property metadata "references" (inspired by ANSI SQL):

@property({
  type: 'number',
  required: true,
  references: {
    // a TypeResolver
    model: () => Category,

    // name of the target property
    property: 'id',

    // referential actions (optional)
    onUpdate: 'CASCADE',
    onDelete: 'CASCADE',
  }
})
categoryId: number;

Foreign keys at model level

Modify the current connector-dependant syntax to make it easier to read and
support composite foreign keys too.

@model({
  foreignKeys: {
    [keyName]: {
      // optional, overrides keyName
      name: 'constraint_name_for_db',

      // Property name(s) (will be mapped to column name)
      // formerly: foreignKey
      sourceProperties: ['source property name'],

      // formerly: entity
      targetModel: 'TargetModel',

      // Property name(s) (will be mapped to column name)
      // formerly: entityKey
      targetProperties: ['target property name'],

      // referential actions (optional)
      onUpdate: 'CASCADE',
      onDelete: 'CASCADE',
    },
  },
})
class MyModel extends Entity {}

Acceptance criteria

  • Describe the new syntax in definition interfaces in model.ts (see the spike proposal for inspiration), include comprehensive API documentation. Make it clear that this new syntax is a work in progress and may not be supported by all connectors yet. Add links to relevant GitHub issues where people can track progress.

  • Modify DefaultCrudRepository constructor to process model-level indexes and foreign keys; it needs to fill the corresponding fields in juggler model and property settings. The actual index/fk definitions should be passed to juggler mostly as-is.

  • Update examples/todo-list to define FK and UNIQUE constraints to support existing relation definitions.

  • Update loopback4-example-shopping to define FK and UNIQUE constraints to support existing relation definitions

  • Update CLI templates for relations to define the constraints too. If the pull request #2426 is not landed yet then create a follow-up story instead.

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

調査の方向性

model.ts の定義インターフェースとリンクされた spike 提案から始め、次に DefaultCrudRepository のコンストラクターを追ってください。todo-list と loopback4-example-shopping の更新、および CLI のリレーションテンプレートを確認してください。文書化された構文、リポジトリ処理、例、該当するテンプレートの変更が、列挙された受け入れ基準をすべて満たせば完了です。

索引モデルが issue の本文から書いたものです。

評価

技術スタック
typescript
領域
backend-api-design, databases
issue の種類
機能追加
難易度
5/5
見積もり時間
1週間以上
活発さ
停滞
明瞭さ
おおむね明確
初心者へのやさしさ
18/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。