Sequelize 外键引用复合主键

Sequelize foreign key reference composite primary key

我正在尝试使用 sequelize (postgre) 'Ingredient' table 创建列 normalizedName/userId,其中每个用户 ID 的 normalizedName 是唯一的。

第二个 table 是 'IngredientQuantity',列 ingredientId/userId/quantity。

我尝试在 'Ingredient' 中设置 normalizedName 和 userId 作为主键,并将这个来自 'IngredientQuantity' table 的复合 PK 与 ingredientId 设置为外键,但我发现使用 sequelize 是不可能的, 外键中仅使用 normalizedName 进行引用。

最好的方法是什么?我考虑过 id 自动递增,但所有 id 都是在所有用户之间共享的。例如,用户 1 创建他的第一个成分,id = 1,当用户 2 创建他的第一个成分时,他将拥有 id = 2。所以。我不知道这是否是个好主意,如果所有用户都有很多成分,我应该使用 bigint 等。如果他们 delete/add/delete/add id 会长大。

成分table

module.exports = (sequelize, DataTypes) => {
    var Ingredient = sequelize.define('ingredient', {
        name: DataTypes.STRING,
        normalizedName: { type: DataTypes.STRING, primaryKey: true },
        userId: { type: DataTypes.INTEGER, primaryKey: true }
    }, {
        freezeTableName: true
    });

    Ingredient.associate = function (models) {
        models.ingredient.hasMany(models.ingredientQuantity);
        models.ingredient.belongsTo(models.user, {
            onDelete: "CASCADE",
            foreignKey: {
                allowNull: false
            }
        });
    };

    return Ingredient;
};

成分数量table

module.exports = (sequelize, DataTypes) => {
    var IngredientQuantity = sequelize.define('ingredientQuantity', {
        quantity: DataTypes.FLOAT,
    }, {
        freezeTableName: true
    });

    IngredientQuantity.associate = function (models) {
        models.ingredientQuantity.belongsTo(models.ingredient);
        models.ingredientQuantity.belongsTo(models.user, {
            onDelete: "CASCADE",
            foreignKey: {
                allowNull: false
            }
        });
    };

    return IngredientQuantity;
};

如果我考虑大量用户的大量数据,最好的方法是什么?还有其他解决方案吗?谢谢

使用SERIAL作为自增整数代理PK是完全正常的。如果您担心整数值范围不够,您也可以使用 UUID 作为自动生成的 PK(在这种情况下,您应该将默认值设置为 uuid_generate_v4())。

因为它是一个服务领域,所以没有必要只对特定用户唯一。通常你不应该依赖 PK 值。