【问题标题】:Sequelize foreign key reference composite primary keySequelize外键引用复合主键
【发布时间】:2021-02-01 12:47:52
【问题描述】:

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

第二个表是“IngredientQuantity”,列有成分Id/userId/quantity。

我尝试将“Ingredient” normalizedName 和 userId 设置为primaryKey,并将“IngredientQuantity”表中的这个复合 PK 设置为外键,但我发现使用 sequelize 是不可能的,只有 normalizedName 用于外键中的引用.

什么是最好的方法?我考虑过 id 自动递增,但所有 id 都在所有用户之间共享。例如 user1 创建他的第一个成分,id = 1,当 user2 创建他的第一个成分时,他将有 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;
};

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

【问题讨论】:

    标签: sql node.js postgresql sequelize.js


    【解决方案1】:

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

    因为它是一个服务字段,所以它不需要只对某个用户是唯一的。通常你不应该依赖 PK 值。

    【讨论】:

    • 感谢您的及时回复。我认为复合主键是“最干净”的解决方案,但实际上即使我永远不会达到整数的最大值,UUID 也是一个不错的选择。
    猜你喜欢
    • 2016-08-21
    • 1970-01-01
    • 2022-11-21
    • 2015-05-14
    • 2012-06-13
    • 1970-01-01
    • 2020-03-28
    • 2018-04-07
    • 1970-01-01
    相关资源
    最近更新 更多