如何处理 JSON 中的多对多关系?

Posted

技术标签:

【中文标题】如何处理 JSON 中的多对多关系?【英文标题】:How do I handle a ManyToMany relationship in JSON? 【发布时间】:2011-06-01 19:57:17 【问题描述】:

这是我之前关于“Managing employee contracts in a many-to-many relationship?”和this question的问题的后续问题

我的关系可以这样解释:

company --< contracts >-- employees

我正在通过 JSON 导入数据。为简单起见,如下所示。


  "companies" : [
    
      "name" : "Company A",
      "employees" : [
        
          "name" : "Tom",
          "contract" : 
            "length" : "10",
            "salary" : "10000"
          
        
      ]
    
  ]

问题是,我不确定这是否正确。

在我的模型关系中,contract 位于 companyemployees 之间,而在我上面的代码中,我将它作为一个对象放在了雇员之下。

因此,我的问题是,联结表应该位于 JSON 提要中的什么位置?

它应该作为员工的父母,还是可以放在哪里?

我不确定我是否做得对,并欢迎任何有关构建/布局依赖于联结表的 JSON 提要的最佳方式的帮助/想法。

我知道这可能看起来很愚蠢,但我正在尝试确定处理联结表时的最佳标准。

谢谢。

编辑。

目的/背景

我正在尝试使用 TouchJSON 将 JSON 读入核心数据。很抱歉没有更早地澄清上下文。更新了标签。

我将 JSON 读入 NSDictionary。如果我开始将对象分开,我不确定如何让 TouchJSON/ios 在解析/读取数据到内存时理解每个关系的上下文。

【问题讨论】:

我认为这取决于你想对数据做什么,你想如何处理它...... 我希望从提要中抓取数据并将其放入核心数据中。 【参考方案1】:

在没有外键的情况下完成此操作的唯一方法是复制关系中“许多”实体的一侧。根据您上面的示例,这意味着在整个数据结构中复制员工。

您实际上只能以与关系数据库解决问题相同的方式解决此问题 - 使用映射表和外键。


  "companies" : [
    
      "id" : 1,
      "name" : "Company A"
    
  ],

  "employees" : [
    
      "id" : 1,
      "name" : "Fred"
    
  ],

  "contracts" : [
    
      "id" : 123,
      "company_id" : 1,
      "employee_id": 1
      "length" : 10,
      "salary" : 10000
    
  ]

(顺便说一句,数值在 JSON 中是有效的,不需要引用)

那么,问题是您在序列化时是否有这些密钥可用。如果没有,那么您可能需要分配一些,即使是临时用于 JSON 的目的,以实现您的目标。

【讨论】:

我确实有密钥,因为 JSON 是在 php 应用程序中创建的。但问题是当我在 Core data/iOS 中反序列化它时,因为我不确定如何确保 TouchJSON/iOS 在阅读时理解每个关系的上下文。 想更多关于这个解决方案,这是否意味着我需要将 API 投入使用,因为我宁愿不这样做而只使用固定文件(在本例中为 JSON)。我不确定如何让 Core data/iOS 理解所有关系等,除非我将整个 JSON 提要加载到内存中,然后通过各种 NSDictionaries 进行拖网以查找匹配项。这听起来相当费时费力。如果还有其他方法,我有兴趣至少看看它。 @zardon 我们在这里讨论了多少数据? 不多,不到 10k,因此文件大小非常小。据我了解,有两种选择。 1. 使用 API 进行所有的交叉引用并根据需要加载。出于安全原因,我想避免使用 API。 2. 将平面文件 JSON 加载到每个实体的字典(公司字典、合同字典和员工字典)中,然后使用 iOS 进行处理,并将它们作为核心数据插入。我不确定的是如何使它进行链接。如果有可用的示例,我会看看它。 @zardon 老实说,我不熟悉核心数据,所以你自己在那里。最终,上述表示保留了您在原始关系数据库中的关系。从长远来看,我相信任何其他无法维持这些关系的解决方案都将更难处理。【参考方案2】:

您的实体-关系 (E-R) 模型通过关联实体表达多:多关系的主要原因是关系数据模型(关系数据库是您的 E-R 模型实现的最可能位置)不能直接表达many:many 关系——它需要一个 intersect 表来实现 many:many 关系。请注意,您可能需要这样一个相交表还有其他原因(例如,合同本身就是一个实体)。

但是,您的对象模型没有理由必须受到关系数据库施加的约束。

【讨论】:

我对实体关系模型很满意,并且我已经对其进行了测试,它确实解决了我的需求/问题;然而 JSON 的东西让我很困惑。是不是要体现关系数据库的结构,如果我开始分离,iOS是如何理解关系上下文的? 我刚刚决定简化应用程序并尽可能避免这种情况。 我的 2 美分:JSON 并不是为了反映 E-R 模型或关系数据库,它只是一个可以模拟 分层 数据库的文本列表。

以上是关于如何处理 JSON 中的多对多关系?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理MongoDB中的多对多关系?

如何处理淘汰视图模型中的多对多关系

使用 Spring Boot、Jackson 和 Hibernate 的多对多关系

MVC4 DTO 和多对多关系与 WebAPI 的扩展方法

道。多对多关系

与 refClass 中的属性的多对多关系