商品とキーワードを分ける

8396 ワード

키워드は、関連商品を検索するために使用される.(キーワードはスペースで区切られて入力されます.)

🤔 既存と現在の比較


従来の方法は、productテーブルにキーワードを直接入れることです.
その後、クエリー自動完了機能を作成しようとしたときによく考えてみると、キーワードが重複しているときのデータが重複しているという問題が発見され、インポート時にもより便利で、より容易に区別したいので、N : Mの関係でキーテーブルを分けて生成したほうがいいと思います.
  • 기존 스키마 정의 ( prisma )
  • model Product {
      id          Int      @id @default(autoincrement())
      name        String   @db.VarChar(30)
      price       Int
      description String   @db.MediumText
      image       String?
      keywords	  String   @db.VarChar(40)
      createdAt   DateTime @default(now())
      updatedAt   DateTime @updatedAt
    
      records  Record[]
      answers  Answer[]
    
      user   User @relation(fields: [userId], references: [id], onDelete: Cascade)
      userId Int
    
      @@index([userId])
    }
  • 현재 스키마 정의 ( prisma )
  • model Product {
      id          Int      @id @default(autoincrement())
      name        String   @db.VarChar(30)
      price       Int
      description String   @db.MediumText
      image       String?
      createdAt   DateTime @default(now())
      updatedAt   DateTime @updatedAt
    
      records  Record[]
      answers  Answer[]
      keywords Keyword[]
    
      user   User @relation(fields: [userId], references: [id], onDelete: Cascade)
      userId Int
    
      @@index([userId])
    }
    
    model Keyword {
      id        Int      @id @default(autoincrement())
      keyword   String   @unique @db.VarChar(20)
      createdAt DateTime @default(now())
      updatedAt DateTime @updatedAt
    
      products Product[]
    }

    😀 使用コードの例の変更

  • 既存投稿生成コード
  • // async 함수 내부에 있다고 가정
    const createdProduct = await prisma.product.create({
      data: {
        name,
        price: +price,
        description,
        image: photo ? photo : null,
        keywords,
        user: {
          connect: {
            id: user?.id,
          },
        },
      },
    });
  • 現在の投稿生成コード
  • // async 함수 내부에 있다고 가정
    const createdProduct = await prisma.product.create({
      data: {
        name,
        price: +price,
        description,
        image: photo ? photo : null,
        user: {
          connect: {
            id: user?.id,
          },
        },
      },
    });
    
    // 키워드 생성 or 찾고 상품과 연결
    const keywordsPromise = (keywords as string).split(" ").map((keyword) =>
      prisma.keyword.upsert({
        create: {
          keyword,
          products: {
            connect: {
              id: createdProduct.id,
            },
          },
        },
        update: {
          products: {
            connect: {
              id: createdProduct.id,
            },
          },
        },
        where: {
          keyword,
        },
      })
    );
    
    await Promise.all(keywordsPromise);

    🔎 の最後の部分


    残りの導入商品、導入関連商品などのコードも修正されています.