Objection.js 中的多对多关系

Posted

技术标签:

【中文标题】Objection.js 中的多对多关系【英文标题】:Many-to-Many-to-Many relationship in Objection.js 【发布时间】:2019-04-05 19:23:56 【问题描述】:

我有一个项目,用户可以拥有许多平台。这些平台可以有很多密码。目前我有以下数据库结构:

我正在尝试使用预先加载来获取以下对象:


    "id": 1,
    "username": "Keith",
    "platforms": [
        
            "id": 1,
            "name": "Jira",
            "passwords": [
                
                    "id": 1,
                    "password": "hash"
                ,
                
                    "id": 2,
                    "password": "otherhash"
                
            ]
        ,
        
            "id": 2,
            "name": "Confluence",
            "passwords": [
                
                    "id": 3,
                    "password": "anotherhash"
                ,
                
                    "id": 4,
                    "password": "anotherone"
                
            ]
        
    ]

我花了几个小时想不通。我如何定义关系以获得这种结构?这可能吗?

【问题讨论】:

【参考方案1】:

据我所知,如果不为该 3 路连接表创建自己的模型,这是不可能的。

所以模型看起来像这样:

class User extends objection.Model 
  static get tableName() 
    return 'user';
  

  static get relationMappings()  
    return 
      platformPasswords: 
        relation: Model.HasManyRelation,
        modelClass: UserPlatformPassword,
        join: 
          from: 'user.id',
          to: 'user_platform_password.user_id'
        
      
    
  


class Platform extends objection.Model 
  static get tableName() 
    return 'platform';
  


class Password extends objection.Model 
  static get tableName() 
    return 'password';
  


class UserPlatformPassword extends objection.Model 
  static get tableName() 
    return 'user_platform_password';
  

  static get relationMappings()  
    return 
      password: 
        relation: Model.HasOne,
        modelClass: Password,
        join: 
          from: 'user_platform_password.password_id',
          to: 'password.id'
        
      ,
      platform: 
        relation: Model.HasOne,
        modelClass: Platform,
        join: 
          from: 'user_platform_password.platform_id',
          to: 'platform.id'
        
      
    
  

也许还有其他一些方法可以对这些关系进行建模,至少在进行急切选择时它们可以工作,但我很难理解它是如何工作的,以防你想插入/更新插入嵌套数据,其中多个关系处理同一个连接表的不同字段。

【讨论】:

谢谢!我正在寻找的确实是不可能的。我最终将我的数据库结构更改为这个:jsfiddle.net/1bwLomgz。现在急切加载更容易,但我觉得数据库变得更难阅读......所以我想知道实现这种多对多关系的最佳方法/实践是什么 也许通过有 2 个单独的连接表,一个用于平台,它链接用户和平台,然后第二个用于密码,它使用具有 user_id 和 platform_id 设置vincit.github.io/objection.js/recipes/… 的复合键链接用户、密码和平台或在 postgresql 的情况下,您还可以将密码列表存储在 JSONB 列中作为连接表中的额外字段。在上一个示例中的 cmets 中提到了这里 vincit.github.io/objection.js/api/model/… 哇,不知道最后一个功能。非常感谢

以上是关于Objection.js 中的多对多关系的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server Analysis Services 中的多对多关系;第二个多对多关系不起作用

Hibernate-ORM:12.Hibernate中的多对多关联关系

如何处理mongodb中的多对多关系

sqlalchemy中的多对多自引用关系

教义中的多对多关系

更新 Prisma 中的多对多关系