Sobes.tech
Middle

Ի՞նչ է n+1 ընտրության խնդիրը։

sobes.tech AI

Պատասխան AI-ից

Սա կատարողականի խնդիր է տվյալների բազաների հետ աշխատելիս, երբ կապված տվյալները ստանալու համար անհրաժեշտ է N+1 հարցում՝ մեկի փոխարեն:

Սա տեղի է ունենում, երբ:

  1. կատարվում է մեկ հարցում՝ հիմնական օբյեկտների ցանկը ստանալու համար:
  2. ապա, յուրաքանչյուր այդ օբյեկտի համար, կատարվում է առանձին հարցում՝ կապված ենթաօբյեկտները ստանալու համար:

JPA-ում օրինակ՝

// Օգտագործողների ցանկը ստանալ
List<User> users = userRepository.findAll();

// Ամեն օգտվողի համար ստանալ նրա պատվերները
for (User user : users) {
    List<Order> orders = user.getOrders(); // Կոչում է N հարցում տվյալների բազային, յուրաքանչյուր օգտվողի համար
}

Որոշում՝ Օգտագործել հարցումներ՝ կապված տվյալները միանգամից բեռնելու համար՝

  1. JOIN FETCH: Բեռնում է կապված օբյեկտները հիմնական օբյեկտի հետ մեկ հարցում:

    // JPQL օրինակ
    List<User> users = entityManager.createQuery("SELECT u FROM User u JOIN FETCH u.orders", User.class).getResultList();
    
  2. EntityGraph: Դեկլարացիա՝ օբյեկտների գրաֆիկի, նշելու համար՝ որոնք կապված օբյեկտները պետք է բեռնվեն:

    // Օբյեկտի մակարդակով
    @Entity
    @NamedEntityGraph(name = "User.orders", attributeNodes = @NamedAttributeNode("orders"))
    public class User {
        // ...
    }
    
    // Օգտագործում պահեստում
    @Query("SELECT u FROM User u")
    @EntityGraph(value = "User.orders")
    List<User> findAllWithOrders();
    
  3. Batch Fetching: Բեռնում՝ կապված օբյեկտները խմբերով (ORM-ը դա կարող է անել ֆոնային ռեժիմում՝ համապատասխան կոնֆիգուրացիայով):

Նպատակը՝ լուծել N+1 խնդիրը՝ զգալիորեն բարելավելով հավելվածների կատարողականությունը՝ նվազեցնելով տվյալների բազայի հարցումների քանակը։