如何处理 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
位于 company
和 employees
之间,而在我上面的代码中,我将它作为一个对象放在了雇员之下。
因此,我的问题是,联结表应该位于 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 中的多对多关系?的主要内容,如果未能解决你的问题,请参考以下文章