web-dev-qa-db-ja.com

Sequelize.jsシードモデルで複合主キーを参照する

Sequelizeで複合主キーを参照することはできますか?

私は台所のゴミを整理するのに役立つウェブアプリに取り組んでいます。レストランでは、週と月を「期間」に編成し、9月の最初の週は「9.1」になります。期間ごとに、その期間の価格と数量を追跡できる原料オブジェクトの新しいバッチを作成する必要があります。データベース内で一意になるため、期間のプライマリキーを月と週を組み合わせて作成するのが最適だと思います。私は後で年を追加するかもしれませんが、それは私の問題を変えません。

私が使用しているデータベースはPostgresです。

これは私のsequelizeシードファイルの周期表モデルです:

.then(() => queryInterface.createTable('periods', {
      month: {
        type: Sequelize.INTEGER,
        validate: {
          max: 12,
          min: 1
        },
        unique: "monthWeekConstraint",
        primaryKey: true
      },
      week: {
        type: Sequelize.INTEGER,
        validate: {
          max: 4,
          min: 1
        },
        unique: "monthWeekConstraint",
        primaryKey: true
      },
      createdAt: {
        type: Sequelize.DATE
      },
      updtedAt: {
        type: Sequelize.DATE
      }
    }))

PeriodItemsテーブルの上のテーブルに保存されている期間を参照したいのですが、これは(誤って)次のようになっています。

.then(() => queryInterface.createTable('periodItems', {
  periodMonth: {
    type: Sequelize.INTEGER,
    references: {model: 'periods', key: 'monthWeekConstraint'}
  },
  periodWeek: {
    type: Sequelize.INTEGER,
    references: {model: 'periods', key: 'monthWeekConstraint'}
  },
  day: {
    type: Sequelize.INTEGER,
    validate: {
      min: 1,
      max: 7
    }
  },
...other irrelevant fields...
}))

私は間違いなくデータベースに慣れていないので、私が大丈夫だと謝罪します。私は自分がやりたいことをしている他のテーブルをいくつか手に入れましたが、私はこの問題に数日間こだわっています。

6
sleepy_pf

Sequelizeで複合主キーを作成することは可能ですが、primaryKey: true複数の列に対して(上記で既に行ったように)、Sequelizeは現在複合外部キーをサポートしていないため、複合主キーを持つモデル/テーブルを参照する方法はありません。

このテーマに関する議論については、 https://github.com/sequelize/sequelize/issues/311 を参照してください。

9
Timshel