【问题标题】:How to Convert Existing MySQL Schema to Core Data如何将现有 MySQL Schema 转换为 Core Data
【发布时间】:2011-07-20 03:15:21
【问题描述】:

我有一个 MySQL 数据库,并希望在 Core Data 中具有类似的结构。我对在 Xcode 中使用 Core Data 非常陌生。如果我做对了,我有几个基本问​​题。

Mysql DB 看起来类似于这样:

table.caveconditions
  visibilityID
  percolationID
  xxxx

table.visibility
  visibilityID
  visibilityValue

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

现在,我已经完成了这样的核心数据建模,但我不太确定这是否是正确的方法。

如果有人能告诉我这是否是正确的做法,那就太好了。最后我想使用JSON字符串将mysql表转储到核心数据中。

非常感谢 克里斯

我已经创建了新架构。是这样吗?

【问题讨论】:

    标签: ios core-data data-modeling


    【解决方案1】:

    它看起来不错,除了所有的“xxxID”属性,例如caveID。您还需要遵循命名约定。

    您在两个或多个实体中具有相同的属性名称(可能)具有相同的值。这在 SQL 中对于连接是必要的,但在 Core Data 中,这是由对象和关系处理的。

    Core Data 中的每个对象都是自动普遍唯一的。这意味着当您创建从一个对象到另一个对象的关系时,该关系具体标识在特定的唯一对象上。

    这意味着您只需要caveID 指定的实际实体中的caveID 之类的属性,在这种情况下(可能)是Caves 实体。您不需要 CavesConditions 实体或与“洞穴”实体有关系的任何其他实体中的属性。

    (如果xxxID 只是 SQL 的产物,那么您实际上在 Core Data 中并不需要它们,除非您的应用与之交互的某些外部数据库需要它们。)

    一个好的经验法则是,任何特定值都应该只出现在关系的一侧,理想情况下,在整个数据模型中只出现一次。

    命名约定与 SQL 略有不同。核心数据实体不是表。实体更类似于类。每个实体都应该描述一个托管对象的单个实例。这些实例中有多少最终出现在对象图中是无关紧要的。因此,实体名称是单数的。

    在这种情况下,Caves 应该是 Cave,Countries 应该是 Country 等等。

    关系以其目标实体命名。这不是很明显,但可视化数据模型编辑器上的每个互惠关系(默认)实际上是两个关系,因为每一侧都有一个关系描述。每一方都有目标实体的名称。按照惯例,一对一关系有一个单数名称,而一对多关系有一个复数名称。

    所以:

    Caves.relConditions<-->>CaveConditons.getCave 
    

    ...会变成

    Cave.conditons<-->>CaveConditon.cave
    

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

    【讨论】:

    • 感谢您的解释。所以我不需要所有 xxID 来引用另一个实体,因为它是由具有关系的核心数据处理的?我仍然会保留 Cave.caveID 以便能够搜索特定的 CaveID?今晚我将尝试进行所有更改,并将编辑我以前的帖子。希望我已经正确理解了一切。
    • 新的数据模型看起来不错,除了你应该用它在另一侧的目标对象来命名每一侧的关系,例如Flow.flows 指向 CaveCondition,因此该关系应命名为 Flow.conditions。这使得在代码中很容易理解关系的目标。 Flow.flows 暗示该关系以另一个流对象为目标。但是从另一边CaveCondition.flow 说得通。
    • 知道了。非常感谢您的帮助!
    【解决方案2】:

    CoreData 不是数据库。尽可能简单地重构您的数据,并以适合您的应用程序使用方式的方式重构您的数据,不要考虑连接或基于结构的优化。您无法控制 CoreData 对象模型的支持模式。这是你开始使用 CoreData 时必须克服的最难的概念,但一旦你这样做了,你会变得更好。

    【讨论】:

    • 我同意你的回答。但我还必须找到一种方法来保持 Core Data 和在线 MySQL DB 之间的数据同步。如果我完全重组 Core Data,我需要一个更复杂的方法将其更改回 JSON,以便将其导入我的 MySQL 数据库。你怎么看?
    • 就个人而言,我认为在没有一些中间翻译层的情况下保持它们“同步”是不切实际的。沿着这些思路,如果您需要一些中间 Web 服务(或其他),那么您不妨制作一个最适合您的平台(在本例中为 iOS)的数据模型,并使用该中间层来完成繁重的将其转换为您的平台及其数据模型可用的格式。
    猜你喜欢
    • 1970-01-01
    • 2022-01-11
    • 2018-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多