如何在JSON中处理ManyToMany关系?

时间:2011-06-01 19:57:17

标签: json core-data many-to-many

这是我之前关于“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之间,而在上面的代码中,我把它作为一个对象,它作为一个孩子坐在员工之下。 / p>

因此,我的问题是,联结表应该放在JSON Feed中的哪个位置?

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

我不确定我是否正确行事并欢迎任何有关构建/布局依赖于联结表的JSON Feed的最佳方法的帮助/想法。

我知道这看起来很愚蠢,但我正在努力确定处理交接表时的最佳标准。

感谢。

编辑。

目的/背景

我正在尝试使用TouchJSON将JSON读入Core数据。对于之前没有澄清背景的道歉。更新了标签。

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

2 个答案:

答案 0 :(得分:2)

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

你真的只能解决这个问题,就像关系数据库解决问题一样 - 使用映射表和外键。

{
  "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的目的分配一些,甚至是暂时的,以实现你的目标。

答案 1 :(得分:1)

您的实体关系(ER)模型表达很多的主要原因:通过关联实体的许多关系是因为关系数据模型(关系数据库是ER模型实现的最可能的基因座)无法直接表达很多:许多关系 - 它需要一个交叉表,用于许多关系。请注意,还有其他原因可能需要这样的交叉表(例如,合同本身就是一个实体)。

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