loopbackio / loopbackio/loopback-next
New syntax for INDEX and FOREIGN KEY definition
まだ誰も着手していません。
- 主要言語
- 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
propertiesas 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
keysfield as a key-value map from database column name to
indexing order, see the description of the actual status below. Entries from
keysshould be merged with entries fromproperties,keystaking
precedence (replacingpropertiesentries). -
Keep supporting
uniquefield (set it totrueto 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
DefaultCrudRepositoryconstructor 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.
コントリビューションガイド
はじめの一歩
- issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
- 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
- リポジトリをフォークし、ブランチを切って変更します。
- issue 番号を参照したプルリクエストを送ります。
調査の方向性
model.ts の定義インターフェースとリンクされた spike 提案から始め、次に DefaultCrudRepository のコンストラクターを追ってください。todo-list と loopback4-example-shopping の更新、および CLI のリレーションテンプレートを確認してください。文書化された構文、リポジトリ処理、例、該当するテンプレートの変更が、列挙された受け入れ基準をすべて満たせば完了です。
索引モデルが issue の本文から書いたものです。
評価
- 技術スタック
- typescript
- 領域
- backend-api-design, databases
- issue の種類
- 機能追加
- 難易度
- 5/5
- 見積もり時間
- 1週間以上
- 活発さ
- 停滞
- 明瞭さ
- おおむね明確
- 初心者へのやさしさ
- 18/100