Как записать записи таблицы в базу данных? - PullRequest
1 голос
/ 08 апреля 2020

У меня есть таблица в базе данных, в которой хранятся товары для покупки (назовем таблицу Product). Необходимо отслеживать изменения каждого продукта. У меня есть 2 идеи для управления версиями записей.

Сначала необходимо создать новую запись в Product, скопировав продукт и переопределив поля, которые отличаются, и сохранить ссылку в записи для более старой и более новой версии. В этом случае запись в таблице Product доступна только для чтения, за исключением поля, в котором указано, заархивирован ли продукт или нет.

Второй - создание 2 таблиц: Product и ArchivisedProduct. Записи Продукта доступны для редактирования, но для каждого изменения создается новая запись в ArchivisedProduct, в которой хранятся только различия (поэтому, кроме идентификатора, все поля могут быть обнуляемыми), а поля таблиц содержат ссылки друг на друга.

Делать Вы знаете какой-нибудь инструмент, который может управлять этим процессом и хорошо работает с Node.js, Prisma, PostgreSQL и Apollo? Для такого использования рекомендовался winston / papertrail, но когда я читаю документы, создается впечатление, что он создает только журналы.

Примерная структура базы данных для большей очистки: 1-й пример:

type Product {
  id: Int! @id
  name: String!
  price: Float!
  archived: Boolean!
  productVersionIds: [Product]!
}

2-й пример:

type Product {
  id: Int! @id
  name: String!
  price: Float!
  archivisedProductIds: [ArchivisedProduct]! @relation(name: "ProductToArchiva")
}

type ArchivisedProduct {
  id: Int! @id
  name: String
  price: Float
  product: Product! @relation(name: "ProductToArchiva")
}

1 Ответ

0 голосов
/ 09 апреля 2020

В зависимости от того, сколько продуктов вы собираетесь хранить, может быть проще хранить каждую версию продукта в модели ProductVersion, а затем следить за последним продуктом («головой») в модели Product .

У вас будет:

type ProductVersion {
  id: Int! 
  version: Int!
  name: String!
  price: Float!

  @@id([id, version])
}

type Product {
  productId: Int! @id
  headVersion: Int!
  productVersion: Product! @relation(fields: [productId, headVersion], references: [id, version])
}

Для каждого изменения в Продукте вы сохраняете новый ProductVersion, содержащий информацию, и обновляете соответствующий Product, чтобы указать HeadVersion к новому ProductVersion. Все это будет частью одной транзакции для обеспечения согласованности.

Для запроса списка продуктов вы должны использовать объект Product и присоединиться к ProductVersion. Если вы храните много товаров, и объединение является проблемой, вы можете рассмотреть возможность иметь копию целых ProductVersion данных в Product вместо использования отношения через поле headVersion.

Примечание что это также подразумевает, что вы будете вычислять diff во время выполнения, и не будете хранить их непосредственно в самой базе данных.

...