我正在尝试使用 sequelize (postgre) 'Ingredient' 表创建,其中包含 normalizedName/userId 列,其中 normalizedName 每个 userId 都是唯一的。
第二个表是'IngredientQuantity',列成分Id/userId/quantity。
我尝试将'Ingredient' normalizedName 和userId 设置为primaryKey,并将'IngredientQuantity' 表中的复合PK 设置为外键,并带有成分ID,但我发现sequelize 无法做到这一点,只有normalizedName 用于外键中的引用。
什么是最好的方法来做到这一点?我想过 id 自动递增,但所有 id 都在所有用户之间共享。例如,用户 1 创建他的第一个成分 id = 1,当用户 2 创建他的第一个成分时,他的 id = 2。所以。我不知道这是否是个好主意,如果所有用户都有很多成分,我应该使用 bigint 等……如果他们删除/添加/删除/添加 id 会长大。
配料表
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;
};
成分数量表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 值。
关于sql - Sequelize 外键引用复合主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64415542/