---
title: Prefer Select Over Include in Prisma Queries
impact: HIGH
impactDescription: Reduces data transfer and prevents data leaks
tags: prisma, database, performance, security
---
## Паспорт документа

- Статус документа: living standard
- Актуально на: 28 марта 2026 года
- Владелец: backend/platform-команда
- Пересмотр: при изменении инженерной практики, CI/CD, архитектурных правил или локального workflow
- Область применения: внутренние rule/reference-card документы для инженерной команды
- Связанные документы:
  - [Индекс Agents](../README.md)
  - [Команды разработки](../commands.md)
  - [Инженерные принципы](../../governance/engineering-principles.md)

## Prefer Select Over Include in Prisma Queries

**Impact: HIGH**

Using `select` instead of `include` fetches only the fields you need. This improves performance and prevents accidental exposure of sensitive data.

**Incorrect (include fetches all fields):**

```typescript
const item = await this.prisma.item.findFirst({
  where: { slug },
  include: {
    seller: true,  // Gets ALL seller fields including internal ones
    reviews: true, // Gets ALL review fields
  }
});
```

**Correct (select for specific fields):**

```typescript
const item = await this.prisma.$replica().item.findFirst({
  where: { slug, status: 'PUBLISHED' },
  select: {
    id: true,
    title: true,
    slug: true,
    description: true,
    price: true,
    imageUrl: true,
    seller: {
      select: {
        id: true,
        name: true,
        logoUrl: true,
        rating: true,
      }
    },
    reviews: {
      select: {
        id: true,
        rating: true,
        comment: true,
        createdAt: true,
        user: {
          select: {
            id: true,
            name: true,
          }
        }
      },
      take: 10,
      orderBy: { createdAt: 'desc' },
    }
  }
});
```

**Benefits:**
- **Performance**: Smaller payloads, faster queries
- **Security**: Prevents accidental exposure of sensitive fields
- **Clarity**: Makes data requirements explicit
- **Network**: Less data transferred between DB and backend

**Exception:** Use `include` only when you genuinely need ALL fields from a relation, which is rare. Always prefer `select`.
