【问题标题】:Sequelize Composite Foreign KeySequelize 复合外键
【发布时间】:2015-05-14 22:15:03
【问题描述】:

我有一个包含以下表格的数据库:

CREATE TABLE IF NOT EXISTS `app_user` (
  `user_id` INT NOT NULL,
  `user_name` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`user_id`))
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `user_folder` (
  `user_id` INT NOT NULL,
  `document_id` INT NOT NULL,
  PRIMARY KEY (`user_id`, `document_id`),
  CONSTRAINT `fk_user_document_user`
    FOREIGN KEY (`user_id`)
    REFERENCES `zinc`.`app_user` (`user_id`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;

CREATE TABLE IF NOT EXISTS `folder_content` (
  `user_id` INT NOT NULL,
  `document_id` INT NOT NULL,
  `content_id` INT NOT NULL,
  PRIMARY KEY (`user_id`, `document_id`, `content_id`),
  CONSTRAINT `fk_folder_content_folder`
    FOREIGN KEY (`user_id` , `document_id`)
    REFERENCES `zinc`.`user_folder` (`user_id` , `document_id`)
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB;

我需要创建一个 Sequelize 模型来表示它。我唯一的问题是关系 folder_content 和 user_folder 因为复合键。

如何创建此续集模型?

这是我目前所拥有的:

var AppUser = sequelize.define('app_user', 
{userId: {type: Sequelize.INTEGER, primaryKey: true, field: 'user_id'}, ... } );

var UserFolder = sequelize.define('user_folder', 
{userId: {type: Sequelize.INTEGER, primaryKey: true, field: 'user_id'}, 
documentId: {type: Sequelize.INTEGER, primaryKey: true, field: 'document_id'}... });

var FolderContent = sequelize.define('folder_content', {
userId: {type: Sequelize.INTEGER, primaryKey: true, field: 'user_id'}, 
documentId: {type: Sequelize.INTEGER, primaryKey: true, field: 'document_id'}, 
contentId: {type: Sequelize.INTEGER, primaryKey: true, field: 'content_id'}... });


UserFolder.hasMany(FolderContent);
FolderContent.belongsTo(UserFolder, {foreingKey: !! });// <- PROBLEM

【问题讨论】:

标签: node.js orm sequelize.js


【解决方案1】:

现在 Sequelize 不支持复合外键。这会产生几个问题。

  1. Sequelize 创建表时,表定义没有复合 FK。
    为了解决这个问题,我在模型上使用了afterSync 钩子和一个函数 如果 FK 不存在,则将 FK 添加到表中。 Example code
  2. 当我将findAll 方法与include 这样的模型一起使用时,我使用findAll 方法的include[].on 选项。或者,如果您不像我那样使用那么多连接,您可以在创建关联时使用scope (see)。

【讨论】:

  • 谢谢! (注意:你的评论说“只用 mysql 测试”。我可以告诉你它只适用于 MySQL,因为你使用 MySQL 专有语法(名称转义的反引号,双引号是标准 SQL)。:D)跨度>
【解决方案2】:

sequelize 仍然不支持复合外键吗?我想要一个带有 2 个外键的表作为复合主键。我宁愿采用这种方式,也不愿将代理键作为主键,并在 2 个外键字段上具有唯一约束。

谢谢

【讨论】:

    猜你喜欢
    • 2021-02-01
    • 2016-08-21
    • 2020-07-09
    • 1970-01-01
    • 2020-03-28
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    相关资源
    最近更新 更多