Ana içeriğe atla
Bir Twenty uygulamasının veri katmanı, uygulamanızın bir çalışma alanına eklediği veridir — bildirdiği yeni kayıt türleri, mevcut nesnelere eklediği sütunlar ve bu kayıtların birbirine nasıl bağlandığı.
┌──────────────────────────────────────────────────┐
│ Object — a record type, e.g. PostCard            │
│    ├─ Field     (name, type, label)              │
│    ├─ Field                                      │
│    └─ Relation  (link to another object)         │
└──────────────────────────────────────────────────┘

            ├── lives in your app, OR


┌──────────────────────────────────────────────────┐
│ Standard / other apps' objects                   │
│    └─ Field added by your app via defineField    │
└──────────────────────────────────────────────────┘

Bu bölümde

Nesneler

defineObject — kendi alanlarına sahip yeni kayıt türleri bildirin.

Nesneleri Genişletme

defineField — standart nesnelere veya diğer uygulamaların nesnelerine alanlar ekleyin.

İlişkiler

Nesneler arasında çift yönlü MANY_TO_ONE / ONE_TO_MANY bağlantıları.

Varlıklara genel bakış

VarlıkAmaçŞununla tanımlanır
NesneKendi alanlarına sahip yeni bir özel kayıt türü (ör. PostCard, Invoice)defineObject()
AlanBir nesne üzerindeki sütun. Bağımsız alanlar, oluşturmadığınız nesneleri genişletebilir (ör. Company nesnesine loyaltyTier ekleyin)defineField()
İlişkiİki nesne arasında, her iki tarafı da alan olarak bildirilmiş çift yönlü bir bağlantıdefineField() ile FieldType.RELATION
DizinNesnelerinizden biri üzerinde yinelenen bir sorguyu hızlandırmak için bir veritabanı dizinidefineIndex()
SDK bunları derleme zamanında AST analiziyle algılar, bu yüzden dosya organizasyonu size kalmıştır — kullanılan gelenek src/objects/, src/fields/ ve src/indexes/ dizinleridir. Kararlı universalIdentifier UUID’leri, dağıtımlar arasında her şeyi birbirine bağlar.

Dizinler (İsteğe bağlı)

Uygulamalar, yinelenen sorguları hızlı tutmak için nesneleriyle birlikte dizinler sunabilir. En yaygın durum, sık okuduğunuz bir durum ya da yabancı anahtar sütunudur.
src/indexes/post-card-status.index.ts
import { defineIndex } from 'twenty-sdk/define';

import {
  POST_CARD_UNIVERSAL_IDENTIFIER,
  STATUS_FIELD_UNIVERSAL_IDENTIFIER,
} from '../objects/post-card.object';

export default defineIndex({
  universalIdentifier: 'b6e9d2a1-5a4c-46ca-9d52-42c8f02d1ff0',
  objectUniversalIdentifier: POST_CARD_UNIVERSAL_IDENTIFIER,
  fields: [
    {
      universalIdentifier: 'b6e9d2a1-5a4c-46ca-9d52-42c8f02d1ff1',
      fieldUniversalIdentifier: STATUS_FIELD_UNIVERSAL_IDENTIFIER,
    },
  ],
});

Benzersiz dizinler

defineIndex, hem tek sütunlu hem çok sütunlu benzersizlik için isUnique: true kabul eder. Önerilen yöntem budur — defineField({ isUnique: true }) kullanımdan kaldırılmıştır ve gelecekteki bir sürümde kaldırılacaktır.
defineIndex({
  universalIdentifier: '…',
  objectUniversalIdentifier: PERSON_UNIVERSAL_IDENTIFIER,
  isUnique: true,
  fields: [{ universalIdentifier: '…', fieldUniversalIdentifier: EMAIL_FIELD_UNIVERSAL_IDENTIFIER }],
});

Diğer kısıtlamalar

  • Kısmi WHERE koşulları yönetici kontrolü altında kalır — uygulamalar bunları tanımlayamaz.
  • Her nesne, 10 özel dizin ile sınırlandırılmıştır (framework’ün kendi dizinleri buna dahil değildir).
fields dizisini, Postgres’in kullanması gereken şekilde sıralayın — en soldaki sütun ilk, bir telefon rehberinde olduğu gibi. Dizinler bedava değildir: tabloya yapılan her yazma işlemi bunları günceller. Bir dizini yalnızca ona ihtiyaç duyan bir sorgunuz olduğunda ekleyin.
Application Config veya Roles & Permissions mı arıyorsunuz? Bunlar, ekledikleri verilerden çok uygulamanın kendisini tanımlar — Config altında bulunurlar. Connections (Linear, GitHub, Slack OAuth) mı arıyorsunuz? Bunlar, mantık fonksiyonları içinden çağrılmak için vardır ve Logic altında bulunurlar.