如何将现有的MySQL架构转换为Core Data

4

我有一个MySQL数据库,想在Core Data中拥有类似的结构。我对使用Xcode的Core Data非常陌生。如果我正在做正确的事情,我有一些基本的问题。

我的Mysql数据库看起来类似于这样:

table.caveconditions
  visibilityID
  percolationID
  xxxx

table.visibility
  visibilityID
  visibilityValue

...等等。然后,我会使用JOINS连接这些表。

现在,我已经按照这种方式进行了Core Data建模,但我不确定这是否是正确的方法。

如果有人能告诉我这是否是正确的方法,那就太好了。最终,我想使用JSON字符串将mysql表转储到core data中。

非常感谢。 Chris

输入图像描述

我已经创建了新的模式。这样做对吗?

输入图像描述

2个回答

4
除了所有的“xxxID”属性,例如caveID,看起来不错。您还需要遵循命名约定。
在两个或多个实体中具有相同的属性名称和(可能)相同的值是必要的SQL连接,但在Core Data中,这由对象和关系处理。
Core Data中的每个对象都自动具有全局唯一性。这意味着当您从一个对象创建到另一个对象的关系时,该关系具体标识一个特定的唯一对象。
这意味着您只需要在实际实体中添加像caveID这样的属性,caveID指定的实体在这种情况下是(可能)Caves实体。您不需要在CavesConditions实体或任何其他具有与“Caves”实体相关联的关系的实体中使用该属性。
(如果xxxID只是SQL的工件,则实际上除非应用程序交互的某些外部数据库需要它们,否则在Core Data中不需要它们。)
使用的一个好方法是任何特定值只应在关系的一侧显示,并且最好在整个数据模型中仅出现一次。
命名约定与SQL略有不同。Core Data实体不是表。实体更类似于类。每个实体应描述受管理对象的单个实例。这些实例中有多少最终出现在对象图中是无关紧要的。因此,实体名称是单数。
在这种情况下,Caves应为CaveCountries应为Country,依此类推。
关系以其目标实体命名。它不是立即明显的,但是可视数据模型编辑器上的每个互补关系(默认)实际上都是两个关系,因为每一侧都有一个关系描述。每一侧都具有目标实体的名称。按照惯例,to-one关系具有单数名称,而to-many关系具有复数名称。
Caves.relConditions<-->>CaveConditons.getCave 

...将变成

Cave.conditons<-->>CaveConditon.cave

命名规范非常重要,因为Objective-C使用约定的名称来生成和搜索访问器方法。

谢谢您的解释。所以我不需要所有的xxIDs来引用另一个实体,因为Core Data会处理关系?我仍然会保留Cave.caveID以便能够搜索特定的caveID吗?我会尝试在今晚做出所有更改,并编辑我的先前帖子。希望我已经完全理解了一切。 - Chris
新的数据模型看起来不错,除了你应该在每一侧通过对象名称命名关系,以指向另一侧的目标对象。例如,Flow.flows 指向 CaveCondition,因此关系应该被命名为类似于 Flow.conditions 的东西。这使得在代码中容易理解关系的目标。Flow.flows 暗示着关系的目标是另一个流对象。然而从另一侧来看,CaveCondition.flow 是完全有意义的。 - TechZen

1

CoreData 不是数据库。尽可能简单地重新设计您的数据,并以适合应用程序使用方式进行,不要考虑连接或基于结构的优化。您无法控制 CoreData 对象模型的后备架构。这是您在开始使用 CoreData 时必须克服的最难的概念,但一旦您克服了它,您将受益匪浅。


1
我同意你的答案。但是我还需要找到一种方法来保持Core Data和在线MySQL数据库之间的数据同步。如果我完全重构Core Data,我将需要更复杂的方法将其改回JSON,以便将其导入我的MySQL数据库。你觉得呢? - Chris
2
个人认为,如果没有一些中间的翻译层来保持它们的“同步”,是不切实际的。在这方面,如果你需要一些中间的网络服务(或其他什么),那么你最好制定一个最适合你的平台(在这种情况下是iOS)的数据模型,并使用该中间层来完成将其转换为可用于你的平台及其数据模型的格式的繁重工作。 - Paul Tiarks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接