sql - Sequelize 外键引用复合主键

标签 sql node.js postgresql sequelize.js

我正在尝试使用 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/

相关文章:

mysql - 仅当重复且符合特定条件时才从 LEFT JOIN 中删除记录

sql - BigQuery 表中按 ID 显示最新行的物化 View ?

mysql - 为什么 'explain' 命令在相同的 SQL 语句上产生不同的结果?

node.js - 在 NodeJs 中处理 Mongodb 全局连接的最佳方法是什么

ruby-on-rails - 试图删除数据库中的重复条目但得到 nil id

java - 如何使用 java 或 jdbcTemplate 从 Postgres 获取二维数组

sql - 如何在 Postgresql 中使用 AM/PM 获取 now() 时间

sql - 查找内部包含重复字母的字符串

javascript - 如何使用 Node.js 将 docx 文件打印到打印机

node.js - 如何使用部分 View 显示ajax错误?